为什么流行数据库中的某些表没有定义主键?

时间:2017-02-08 04:22:53

标签: sql sql-server tfs sap primary-key

我见过SAP数据库和TFS数据库(配置和集合)中没有定义主键的表。那是为什么?

2 个答案:

答案 0 :(得分:2)

在TFS中,由于性能限制非常具体,因此许多表没有主键或外键。此外,这些数据库不应该手动更新,TFS通过自己的API处理这些表的所有更改。这是Microsoft不支持直接查询这些表的原因之一。

TFS案例的另一个原因是它的云端对象Visual Studio Team Services不会将所有数据存储在SQL Azure中,而是存储在表存储Blob存储或DocumentDB中。

答案 1 :(得分:0)

还没有人尝试过这个答案,所以这里......

有些表不需要PRIMARY KEY,因为它们永远不会被更新,并且可能只有一小组数据(例如查找表)。如果这些表根本没有索引,那么它们本质上就是堆,这并不总是坏事。

为什么每个表都要定义PRIMARY KEY?如果表具有UNIQUE CLUSTERED INDEX,那么这将完成PRIMARY KEY所做的一切,并且可以允许存储NULL值。根据实现(例如,SQL Server只允许一个“唯一”NULL值,其他RDBM允许多个),这可能与您的应用程序更好地匹配。

例如,假设您想要一个包含两列,帐号和帐户名的表。假设您使用PRIMARY KEY帐号,因为您希望确保它是唯一的。现在您想要允许NULL帐号,因为这些帐号并不总是在您创建帐户的位置提供;你有一个奇怪的两部分过程,你只需要一个名字创建一个记录,然后回填帐号。如果您坚持使用PRIMARY KEY设计,那么您需要执行类似添加IDENTITY列的操作,将其设为PRIMARY KEY,然后添加UNIQUE CONSTRAINT以防止相同的多个帐号。

现在你留下的代理密钥对任何查询都没什么用处,所以即使你不关心唯一性,你也可能最终得到一个性能指标。

如果您没有PRIMARY KEY,而是一个独特的CLUSTERED INDEX,那么您可以在不更改表的情况下执行此操作,只允许一个客户同时拥有NULL帐号(如果是SQL Server) )。

几年前,我为一位客户设计了一个数据库,该数据库有200多个表,而不是一个PRIMARY KEY。虽然这更多地是关于我“提出一个观点”,但假设其他数据库开发人员也是如此,这并不是一件容易的事。