【问题标题】:Why some tables in popular databases dont have primary keys defined?为什么流行数据库中的某些表没有定义主键?
【发布时间】:2017-06-25 13:43:50
【问题描述】:

我在SAP 数据库和TFS 数据库(包括配置和集合)中看到了没有定义主键的表。这是为什么呢?

【问题讨论】:

  • 这个问题似乎与sql server的数据库结构有关,而不是TFS本身。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    还没有人尝试回答这个问题,所以这里......

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

    为什么每个表都应该定义一个主键?如果表有一个 UNIQUE CLUSTERED INDEX,那么它几乎可以完成 PRIMARY KEY 所做的所有事情,另外还有一个好处是您可以允许存储 NULL 值。根据实现(例如,SQL Server 只允许一个“唯一”NULL 值,其他 RDBM 允许多个),这可能更适合您的应用程序。

    例如,假设您想要一个包含两列的表格,即帐号和帐户名称。假设您制作了 PRIMARY KEY 帐号,因为您想确保它是唯一的。现在您要允许 NULL 帐号,因为这些帐号并不总是在您创建帐户时提供;你有一些奇怪的两部分过程,你创建一个只有名字的记录,然后回填帐号。如果你坚持 PRIMARY KEY 设计,那么你需要做一些事情,比如添加一个 IDENTITY 列,将其设为 PRIMARY KEY,然后添加一个 UNIQUE CONSTRAINT 以防止相同的多个帐号。

    现在您剩下一个代理键,它对任何查询都几乎没有用处,因此即使您不关心唯一性,您也可能最终得到一个性能索引。

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 2015-07-14
      • 2018-10-05
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      相关资源
      最近更新 更多