复合代理外键为PK或单独的代理键

时间:2014-09-17 20:41:42

标签: database-design

下图显示了两种替代数据库设计。一个具有两个外键的复合,一个具有自己的代理键。第二个选项将在DanceGroupId和StudioId上具有复合唯一约束,因此无法输入两个相同的约束。我总是使用第一个设计但是在用C#构建我的类之后,如果我可以在所有表​​上放置一个通用的非复合代理键,它将有助于C#代码重用。在数据库设计方面,在诸如Booking之类的表上使用代理而不是复合是什么?

enter image description here

我不是在寻找一般的复合与代理辩论,它略有不同,因为我在选项一中的复合键是由外键组成的。据我所知,由于不依赖于业务相关数据,代理人比自然密钥更受青睐。在这种情况下,这不是一个值得关注的问题,但从来没有在“中间”桌面上看到过这种方法。在第二个选项中实现它似乎是合理的,但我想知道我是否遗漏了任何东西。

1 个答案:

答案 0 :(得分:4)

当您不需要:

时,可能会出现定义伪警告的负面消息
  • 每行多余的多余整数会使行变宽,在磁盘和内存中占用更多空间。

  • 该机制的更多争用用于生成不必要的伪代价值。

  • 破坏聚集索引的使用以获得额外的性能。定义聚类索引以匹配最常见的查询是有意义的。例如,如果您的查询通常包含StudioId上的条件,则将其作为聚集索引的第一列。在某些SQL实现(例如MySQL)中,主键始终用作聚簇索引。在其他一些SQL实现中,您可以选择另一个辅助唯一键作为聚簇索引。