不是使用复合主键(此表维护表示两个实体[两个表]的两个表之间的关系),而是建议将identity列作为主键,并在两列上强制执行唯一数据约束,这表示来自实体主键的数据.
对于我来说,每个关系表的标识列都违反了规范化规则.
有许多表,您可能希望将标识列作为主键.但是,对于您描述的M:M关系表,最佳做法是不要为主键使用新的标识列.
RThomas在其评论中的链接提供了最佳做法是不添加标识列的绝佳理由.这是那个链接.
几乎在每种情况下,缺点都会超过职业选手,但是既然你要求利弊,我也会提出几个不太可能的优点.
缺点
增加了复杂性
除非您对关系强制执行唯一性(默认情况下主键会执行此操作),否则可能导致重复关系.
可能更慢:db必须维护两个索引而不是一个.
优点
所有职业选手都很粗略
如果您遇到需要使用关系表的主键作为单独表(例如审计表?)的连接的情况,则连接可能会更快.(如上所述 - 添加和删除记录可能会更慢.此外,如果您的关系表是自己使用唯一ID的表之间的关系,则使用连接中的一个标识列与两个标识列的速度增加将是最小的.)
为简单起见,应用程序可能会假定它使用的每个表都有一个唯一的ID作为其主键.(这在应用程序中的设计很糟糕,但你可能无法控制它.)你可以想象一个场景,在数据库中引入一些额外的复杂性比在这样的应用程序中增加额外的复杂性更好.