复合代理外键作为主键,还是单独使用代理键?

3
下面的图片展示了两种不同的数据库设计方案。一种是使用两个外键的组合,另一种则使用自己的代理键。第二种选择将在DanceGroupId和StudioId上设置一个组合唯一约束条件,以避免输入两个相同的值。我一直采用第一种设计,但在使用C#构建类之后,如果我能在所有表上放置一个通用的非组合代理键,那么它将有助于C#代码的重用。在数据库设计方面,相对于组合键,在像Booking这样的表上使用代理键有哪些负面影响?
我不是在寻求关于组合键和代理键的一般性争论,因为我的第一种选择中的组合键由外键组成。据我所知,代理键比自然键更受欢迎,因为它们不依赖于业务相关数据。但在这种情况下,这不是一个问题,也从未是。然而,我从未在“中间”表上看到过这种方法。像第二个选项一样实现似乎是合理的,但我想知道是否有什么我忽略的东西。
1个回答

4
当你不需要定义伪键时,可能会出现以下负面影响:
  • 每行多一个无用的整型会使行变得更宽,在磁盘和内存中使用更多的空间。
  • 生成不必要的伪键值会增加机制上的竞争。
  • 损坏聚集索引以获取额外的性能。将聚集索引定义为匹配最常见查询的列是有意义的。例如,如果您的查询最常涉及到 StudioId 的条件,则将其作为聚集索引的第一列。在某些 SQL 实现中(例如 MySQL),主键始终用作聚集索引。在其他一些 SQL 实现中,您可以选择另一个唯一键作为聚集索引。

谢谢Bill,这似乎是一个不错的回答 :-) 我想这是权衡系统和代码重用的内存和性能要求的情况。对于我所考虑的应用程序解决方案来说,这些考虑可能是最小的。 - atreeon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接