为Name->属性关系设计n:m-Table

时间:2014-03-19 13:16:07

标签: sql-server database-design

我有两张桌子,让我们说“名字”和“地址”。现在我想创建一个以n:m关系将idName链接到idAddress的表。对于此表,有多种解决方案: 1.拥有Link-ID作为主键 2.两个id列上的主键 3.只是两个id列的索引(称为Heap-Table) 4.甚至更多?

这是我的示例的SQLFiddle: http://sqlfiddle.com/#!3/77665/7

不知何故,我觉得不需要人工主键,另一方面,每个表都有一个单列键是一个好习惯。所以,问题是,你会推荐什么样的apprach?为什么?或者我还缺少其他方法吗?

1 个答案:

答案 0 :(得分:0)

我将使用唯一的IDENTITY列:这可确保新插入的主键始终在增加。这很重要,因为它意味着插入始终位于索引的末尾,而不是位于索引的中间位置。插入到索引的中间可能会导致问题,如果它应该继续的页面已满:页面必须分成2(或更多,取决于实际的索引实现)。当这种情况发生在普通(非群集)索引上时,通常不会出现问题。当聚集索引发生时,数据与实际密钥一起存储,问题就更大了,因为它不仅要移动密钥而且要移动数据。

在大多数现代RDBM中,这样的页面拆分不是问题。在旧版本中,我确实看到一个索引拆分需要在电子商务网站(我认为使用SQL Server 2000)中完整重新组织大型用户表,其中GUID作为主键。这意味着它必须取出一个表锁并且基本上停止了该站点:当用户表被锁定时,没有人可以使用它。我们需要花费几个小时来解决这个问题,并且该网站的离线时间比其所有者希望的更长......