适当使用代理键?

时间:2014-10-05 02:53:14

标签: many-to-many relationship erd junction-table surrogate-key

假设一个特定的国家有许多景点(纪念碑,公园,博物馆),当然在许多州都可以存在特定的景象。

就逻辑ERD模型而言,应在M:N关系之间使用联结表。

但是,仅仅使用两个相邻表的PK作为联结表的PK就足够了吗?

也就是说,你有一个COUNTRY,SIGHTS和SIGHT_TYPE表,其中SIGHTS是联结表。 假设一个特定国家可以拥有多个博物馆(即MUSEUM是SIGHT_TYPE),这意味着SIGHTS表中的每个记录都无法唯一标识,不是吗?

即。假设MUSEUM的SIGHT_TYPE_ID为2,而GERMANY的country_id为22。 对于多个博物馆,如果上述情况属实,你不会有这种情况吗? 22 2 - 博物馆A. 22 2 - B博物馆

因此,是否使用代理键,例如SIGHT_ID,在这种情况下绝对必要作为唯一标识符?

换句话说,通常使用两个相邻表的PK作为结点或复合表的PK,但是这些例外是这样的吗?

谢谢

1 个答案:

答案 0 :(得分:0)

连接表(由FK组成)的复合键在逻辑设计级别完全正常。它们保证了联结表中行的唯一性。它们还保证关系的给定实例中的所有参与者仅参与该关系的一个实例。如果您使用某种应用程序构建器工具,该工具必须能够处理复合PK。

通常情况下,该约束正是您想要的。如果在接线盒中添加一个额外的列作为主键,则要么必须在两个外键上添加唯一约束,要么依赖应用程序来防止错误的重复。大多数时候,这些解决方案并不是那么好。

在物理设计级别,它取决于您要对数据执行的操作,要存储的数据量以及特定DBMS。在初始设计中,我倾向于没有额外的代理键,只有在节省的成本超过成本时才添加它。