【问题标题】:DB associative entities and indexing数据库关联实体和索引
【发布时间】:2012-04-27 01:14:22
【问题描述】:

这是一个通用的数据库设计问题。如果有一个关联实体表,即交叉引用,包含基本上只包含两个 FK 引用的记录,是否应该以某种方式对其进行索引?是否有必要显式索引该表,因为关联表中的 PK 已经按定义进行了索引?如果要索引,是否应该是组合索引,由两个FK字段组成?

【问题讨论】:

  • 在这里发一个示例表结构会不会很困难?
  • @vyegorov:我想我们需要的所有信息都在这里了。

标签: postgresql database-design


【解决方案1】:

其他表中引用的 pk 列上的索引不包括它。

通过将两个 fk 列定义为“关联实体”表的复合主键(在大多数情况下您应该这样做 - 前提是关联是唯一的),您可以隐式创建多列索引.

最好地涵盖所有涉及两列或第一列的查询。
它还涵盖了第二列上的查询,但效率较低。
如果您有仅涉及第二列的重要查询,也可以在该列上创建一个附加索引。

related question on dba.SE阅读有关该主题的所有详细信息。
或者this question on SO,也涵盖了这个话题。

【讨论】:

    【解决方案2】:

    假设您的关联表具有如下架构:

    CREATE TABLE Association
    (
        ReferenceA  INTEGER NOT NULL REFERENCES TableA CONSTRAINT FK1_Association,
        ReferenceB  INTEGER NOT NULL REFERENCES TableB CONSTRAINT FK2_Association,
        PRIMARY KEY(ReferenceA, ReferenceB)            CONSTRAINT PK_Association
    );
    

    您的 DBMS 可能会自动创建一些索引。

    一些 DBMS 将为两个外键中的每一个创建一个索引,并为主键创建一个唯一索引。这有点浪费,因为 PK 索引也可以用于访问 ReferenceA。

    理想情况下,假设 PK 索引将 ReferenceA 作为第一列,则只有两个索引:PK(唯一)索引和 ReferenceB(允许重复)FK 索引。

    如果 DBMS 没有自动创建索引来强制执行参照完整性约束,您将需要创建 RI 或 FK 允许重复的索引。如果它没有自动创建索引来强制执行 PK 约束,那么您也需要创建该唯一索引。好处是您只会为理想情况创建索引。

    根据您的 DBMS,您可能会发现创建没有约束的表,然后添加索引,然后添加约束(然后将使用您创建的索引)更有效。像碎片化方案这样的事情也可能会影响到这一点;我在上面忽略了它们。

    这个概念仍然很简单——您总共需要两个索引,一个在两列上强制唯一性并提供对前导列的快速访问,以及一个在尾随列上的非唯一或允许重复的索引。

    【讨论】:

    • 该问题被标记为与 PostgreSQL 相关,并且 PostgreSQL 从不为外键创建索引;它确实为主键或唯一约束创建了唯一的 btree 索引。
    • 我同意有一个 PostgreSQL 标签;还有评论说这是一个一般的数据库设计问题。我试图涵盖一般基础,允许诸如“PostgreSQL 不为 FK 约束创建索引”之类的可能性(我不知道,对此有点惊讶,但只是有点惊讶)。相比之下,Informix 属于“为所有内容创建索引”的学校。表上有三个索引,两个就足够了。
    • 一些 DBMS 还允许仅索引表。我不确定这是否有意义。如果您有两个“仅索引”索引,一个在 (ReferenceA, ReferenceB) 上按该顺序,一个在另一个顺序上,则可能是这样。更有可能的是,这种情况没有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多