“每张桌子”上自动增量键的优缺点

时间:2010-01-04 03:19:56

标签: sql database-design

我们公司正在讨论是否在我们的数据库中的每个表上放置一个自动增量密钥。

我可以理解将一个放在会有FK引用的表上,但我不喜欢将这些键放在我们的每一个表上,即使这些键永远不会被使用。

除了占用额外的空间并减慢一切(我们有一些包含数亿条记录的表格)之外,请帮助我们在每张桌子上放置自动增量键的优点和缺点。

由于

9 个答案:

答案 0 :(得分:11)

我假设几乎所有的表都有一个主键 - 这只是一个问题,即该键是由一个或多个自然键还是一个自动递增的代理键组成。如果您不使用主键,那么在几乎所有表中使用它们通常会获得很多好处。

所以,这里有一些专业人士和代理键的缺点。首先,专业人士:

  • 最重要的是:它们允许自然键改变。一个简单的例子,一个人的表应该有一个主键key_id而不是last_name,first_name。
  • 读取性能 - 非常小的索引扫描速度更快。但是,这只是,如果您实际上是通过代理键限制查询。因此,对查找表有好处,对主表不太好。
  • 简单 - 如果命名合适,它使数据库易于学习和使用。
  • 容量 - 如果您正在设计类似于数据仓库事实表的内容 - 维度上的代理键允许您保留一个非常狭窄的事实表 - 这会带来巨大的容量改进。

并且缺点:

  • 它们不会阻止重复的自然值。因此,您通常仍希望在逻辑密钥上使用唯一约束(索引)。
  • 写性能。使用额外的索引,您将减慢插入,更新和删除更多内容。
  • 简单 - 对于几乎不会改变的小型数据表,它们是不必要的。例如,如果您需要国家/地区列表,则可以使用ISO国家/地区列表。它包括有意义的缩写。这比代理键更好,因为它既小又实用。

一般来说,代理键很有用,请记住缺点,并在适当的时候不要犹豫使用自然键。

答案 1 :(得分:7)

您需要这些表上的主键。你还不知道。

答案 2 :(得分:5)

如果你对Clustered Indexes使用这样的小键,那么它有很大的优势。

像:

插入内容将始终位于页面末尾。

非群集索引(需要引用CIX密钥)不会有长行地址需要考虑。

更多......金佰利特里普的东西是最好的资源。谷歌她......

另外 - 如果你没有其他任何东西可以确保唯一性,那么每行都有一个你不会拥有的钩子。您仍应将唯一索引放在应该唯一的字段上,并在适当的字段中使用FK。

但是...... 请考虑在现有表格上创建此类内容的开销。这可能非常可怕。您可以在表上放置唯一索引,而无需创建额外字段。然后可以将这些唯一索引用于FK。

答案 3 :(得分:3)

我不是每张桌子上自动增加主键的粉丝。这些为您提供快速连接和快速插入插入的想法实际上并非如此。我的公司称这种肉饼是在关于这位女士的故事之后开始思考的,因为她的母亲总是这样做,她总是切断她的肉饼。她的母亲只是因为平底锅太短而做到了 - 即使原因不复存在,传统仍在继续。

  • 当连接中的驱动表具有自动增量键时,连接表经常不应该因为它必须具有到驱动表的FK。它是相同的列类型,但不是自动增量。您可以将FK用作PK或复合PK的一部分。

  • 将自动增量键添加到具有自然唯一键的表中并不总能加快速度 - 它怎么样?您通过维护额外的索引来添加更多工作。如果你从不使用自动增量键,这是完全浪费的努力。

  • 预测优化器性能非常困难 - 而且无法预测未来的性能。在某些数据库中,压缩或聚簇索引将降低自然独特PK的成本。在某些并行数据库上,自动增量键在节点之间协商,这会增加自动增量的成本。您只能通过分析找到答案,而且为了改变您创建表格的方式而必须更改公司政策真的很糟糕。

答案 4 :(得分:2)

使用自动增量主键可以使您以后更容易切换ORM图层,并且成本不高(假设您保留逻辑唯一键)。

答案 5 :(得分:1)

在逻辑设计之后添加代理自动增量主键作为实现的一部分,以尊重数据库引擎的物理磁盘架构。

也就是说,它们具有适合用作聚类键,连接等的物理属性(窄,数字,严格单调增加)。

示例:如果您对数据建模,那么“产品SKU”就是您的关键。之后添加“产品ID”(对“产品SKU”有唯一约束),因为您了解SQL Server,因此编写“CREATE TABLE”语句。

这是主要原因。

脑死亡的另一个原因是ORM在没有它的情况下无法工作......

答案 6 :(得分:1)

使用由两个或更多FK组成的复合PK,许多表格更好。这些表对应于实体 - 关系(ER)模型中的关系。 ER模型对于概念化模式和理解需求很有用,但不应与数据库设计混淆。

表示来自ER模型的实体的表应具有smiple PK。当没有任何自然键可以信任时,您使用代理PK。关于密钥是否可信任的决定不是技术决策。这取决于您将要提供的数据,以及您希望用它做什么。

如果使用自动增量的代理键,则现在必须确保对同一实体的重复引用不会进入数据库。这些重复项将显示为具有不同PK的两行或更多行(因为它已被自动增量),但是否则彼此重复。

如果您将重复项放入数据库,最终您对数据的使用将会变得一团糟。

答案 7 :(得分:0)

最简单的方法是始终使用由db或orm自动递增的代理键。在每张桌子上。这是因为它们是通常禁用的连接方法,并且它们使得学习数据库非常简单,即这些都不是我的关键表,因为它们都使用相同类型的密钥。是的,它们可能会变慢,但事实上,设计中最重要的部分是随着时间的推移不会破坏的东西。这证明了代理键。请记住,系统的维护比开发更长。规划可维护的系统。此外,对于当前的硬件,潜在的性能损失实际上是可以忽略不计的。

答案 8 :(得分:0)

考虑一下:

在一个与另一个表有关系的表中删除记录。出于审计原因,无法删除第二个表中的相应记录。该记录从第一个表变为孤立。如果将新记录插入到第一个表中,并使用顺序主键,则此记录现在链接到孤立。显然,这很糟糕。通过使用自动递增的PK,始终保证以前从未使用过的id。这意味着孤儿仍然是孤儿,这是正确的。

我永远不会使用自然键作为PK。数字PK,如自动增量,在大多数情况下是理想的选择,因为它可以有效地索引。即使删除记录,自动增量也保证是唯一的,从而创建可信数据关系。