AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 25291
Accepted
Phill Pafford
Phill Pafford
Asked: 2012-10-03 10:14:13 +0800 CST2012-10-03 10:14:13 +0800 CST 2012-10-03 10:14:13 +0800 CST

一对多关系的查找表

  • 772

我有一个tickets表id,我需要将它关联到一个查找表,其中该数据的对应项是另一个id由外部源控制的数据。

tickets
- id
- sutff

lookup
- outside_data_id
- ticket_id

我只需要知道关联是否存在(因此是lookup表格)并且具有一对多的关系。outside_data_id我对除了它id本身和相关的东西一无所知ticket_id。

另外我不想改变tickets表格,因为这只会影响少量的ticket_id's.

例子

outside_data_id = 1234

可能与:

ticket_id = 321
ticket_id = 322
ticket_id = 900

下面的查找表结构会起作用还是有更好的方法?

CREATE TABLE lookup
(
   outside_data_id integer, 
   ticket_id integer
)
database-design postgresql
  • 3 3 个回答
  • 5428 Views

3 个回答

  • Voted
  1. Best Answer
    epic_fil
    2012-10-03T10:33:41+08:002012-10-03T10:33:41+08:00

    为此,您的表可以正常工作,但您可能想要添加索引。如果使用此表的主要原因是获取 outside_ticket_id 并获取相应的 ticket_id,我将添加以下聚集索引:

    CREATE CLUSTERED INDEX [CL_Lookup_OD_ID] on [lookup](outside_data_id)
    GO
    

    如果主查找是相反的方式(尝试从 ticket_id 中查找 outside_data_id),则将聚集索引放在另一列上。

    ---- 哦,对不起,刚刚注意到这是 Postgres。上面的语法是 SQL Server。对于 Postgres,在列上创建索引,然后发出 cluster 命令,如下所示:

    CREATE INDEX IX_outside_data_id on lookup(outside_data_id);
    CLUSTER lookup using IX_outside_data_id;
    

    您可能还想查看索引上的“填充因子”,具体取决于此处插入负载的重量。但这是一个值得自己探索的大话题……

    • 5
  2. Erwin Brandstetter
    2012-10-03T14:35:50+08:002012-10-03T14:35:50+08:00

    像您这样的结构可能应该通过以下方式解决:

    • m -table ( )上的多列主键约束和lookup
    • 引用1表的主键的外键约束。

    用于在一个方向上查找值的最佳索引由表的主键自动提供。lookup

    CREATE TABLE ticket (
       ticket_id integer PRIMARY KEY  -- possibly serial instead of integer
     , stuff text
    );
    
    CREATE TABLE lookup (
       outside_data_id integer
     , ticket_id integer REFERENCES ticket(ticket_id)
          -- ON UPDATE CASCADE  -- optional
          -- ON DELETE CASCADE  -- optional
     , CONSTRAINT lookup_pkey PRIMARY KEY (outside_data_id, ticket_id)
    );

    用作ticket_id描述性名称。

    如果你 ..

    只需要知道关联是否存在

    ...那么您可能只需要一个普通的外键。 它会自动处理这一点,并提供额外的好处,即无论如何都会强制执行关系完整性。加上更多的选择。 它还坚持为每一个相关的项目,所以你可能无法使用它。
    filter_id

    所需的实际索引取决于您的工作量,多次阅读您的问题后我仍然不清楚。特别是,多列索引(或主键约束)中的列顺序是相关的 - 正如我们在这个相关问题下深入讨论的那样。

    为了获得最佳性能(忽略索引维护的成本,假设表没有更新太多)并且如果您的查询是双向的,您将在上面定义的主键之外创建另一个索引:

    CREATE INDEX lookup_reverse_idx(ticket_id, outside_data_id);
    

    虽然您可以在 上仅使用单列索引覆盖大多数其他用例ticket_id,但由于 PostgreSQL 存储中的数据对齐,索引中的两个整数列在磁盘上的大小与一个相同。因此,几乎没有任何额外收益的成本。

    在旁边

    使用不同 RDBMS 收集的经验并不总是适用于跨平台。

    PostgreSQL没有CLUSTERED INDEX类似的 SQL server。

    PostgreSQL 的CLUSTER命令关系松散,但工作方式不同。这是一次性操作,不会使表保持集群状态。它还用 a 的所有效果完全重写了表VACUUM FULL(在 Postgres 9.0 之后的现代版本中)。

    根据您的实际工作量CLUSTER,可能有用也可能没用。它可以用于查找多个相关行(outside_data_id-> ticket_id),尤其是对于没有大量更新的表。

    不过,建议FILLFACTOR是好的,特别是如果你使用CLUSTER- 如果你经常使用它实际上可能会损害性能UPDATE。

    • 5
  3. Hannah Vernon
    2012-10-03T10:35:26+08:002012-10-03T10:35:26+08:00

    您创建的结构看起来像是一个非常合理的查找表。

    CREATE TABLE lookup1
    (
       outside_data_id integer NOT NULL 
       , ticket_id integer NOT NULL
    );
    

    我可能会在此表中添加一个索引,例如:

    CREATE CLUSTERED INDEX IX_Lookup1 
        ON Lookup1 (outside_data_id, ticket_id) 
        WITH (ALLOW_PAGE_LOCKS=ON, ALLOW_ROW_LOCKS=ON, FILLFACTOR=100);
    

    (我的CREATE INDEX示例是针对 SQL Server 的,PostgreSQL 很可能需要进行一些更改!)

    • 3

相关问题

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • 在数据仓库中实现多对多关系有哪些方法?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve