数据库关联实体和索引

时间:2012-04-26 14:16:20

标签: postgresql database-design

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

2 个答案:

答案 0 :(得分:3)

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

通过将两个fk列定义为“关联实体”表的复合主键(在大多数情况下应该如此 - 假设关联是唯一的),则隐式创建多列索引

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

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

答案 1 :(得分:1)

假设您的关联表具有如下模式:

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(唯一)索引和ReferenceB的(允许重复)FK索引,假设PK索引将ReferenceA作为第一列。

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

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

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