Sql “自动递增”键的优点和缺点;“每张桌子”;

Sql “自动递增”键的优点和缺点;“每张桌子”;,sql,database-design,Sql,Database Design,关于是否在数据库中的每个表上都放置一个自动递增键,我们公司正在进行相当长的讨论 我能理解把一个键放在表上会有一个FK引用,但我有点不喜欢把这样的键放在我们的每一个表上,即使这些键永远不会被使用 除了占用额外的空间和稍微降低速度之外,请帮助说明在每个表上放置自动增量键的优缺点(我们有一些具有数亿条记录的表) 谢谢,如果您对聚集索引使用像这样的小键,那么它有非常显著的优势 比如: 插入内容将始终放在页面的末尾 非聚集索引(需要引用CIX键)不会有长行地址要考虑。 还有更多。。。金伯利·特里普的东西是

关于是否在数据库中的每个表上都放置一个自动递增键,我们公司正在进行相当长的讨论

我能理解把一个键放在表上会有一个FK引用,但我有点不喜欢把这样的键放在我们的每一个表上,即使这些键永远不会被使用

除了占用额外的空间和稍微降低速度之外,请帮助说明在每个表上放置自动增量键的优缺点(我们有一些具有数亿条记录的表)


谢谢,如果您对聚集索引使用像这样的小键,那么它有非常显著的优势

比如:

插入内容将始终放在页面的末尾

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

还有更多。。。金伯利·特里普的东西是最好的资源。谷歌她

此外,如果您没有其他确保唯一性的方法,那么每一行都有一个钩子,这是其他方法无法做到的。您仍然应该在应该唯一的字段上放置唯一索引,并在适当的字段上使用FKs


<强>但是…请考虑在现有表上创建此类事务的开销。这可能相当可怕。您可以在表上放置唯一的索引,而无需创建额外的字段。这些唯一索引可以用于FKs。

这些表上需要主键。你只是还不知道而已

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

也就是说,它们具有物理属性(窄、数值、严格单调递增),适合用作聚集键、连接等

示例:如果要对数据建模,则“产品SKU”是关键。在编写“CREATETABLE”语句时,会在后面添加“product ID”(对“product SKU”有唯一的约束),因为您了解SQL Server

这是主要原因


另一个原因是脑死亡的ORM如果没有一个就不能工作…

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

表示ER模型中实体的表应该有一个smiple PK。当任何自然密钥都不可信时,使用代理PK。关于密钥是否可信任的决定不是技术决定。这取决于你将要得到的数据,以及你希望用它做什么

如果使用的代理项是自动递增的,那么现在必须确保对同一实体的重复引用不会潜入数据库。这些重复项将显示为具有不同PK的两行或多行(因为它是自动递增的),但在其他方面是彼此的重复项


如果让重复项进入数据库,最终数据的使用将变得一团糟。

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

下面是代理键的一些优点和缺点。首先,专业人士:

  • 最重要的是:它们允许更改自然关键点。举个简单的例子,人员表的主键应该是person\u id,而不是last\u name和first\u name
  • 读取性能-非常小的索引扫描速度更快。但是,这只有在您实际通过代理键约束查询时才有用。因此,对于查找表来说是好的,而对于主表来说则不是好的
  • 简单性-如果命名适当,它使数据库易于学习和使用
  • 容量—如果您正在设计数据仓库事实表之类的东西—维度上的代理键允许您保留一个非常窄的事实表—这会带来巨大的容量改进
反对和反对:

  • 它们不能防止自然值的重复。因此,您通常仍然需要逻辑键上的唯一约束(索引)
  • 写性能。有了额外的索引,插入、更新和删除的速度会慢得多
  • 简单性-对于几乎从不更改的小型数据表,它们是不必要的。例如,如果需要国家列表,可以使用ISO国家列表。它包括有意义的缩写。这比代理键好,因为它既小又有用

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

使用自动递增主键可以使您在将来更容易切换ORM层,并且成本不高(假设您保留逻辑唯一键).

最简单的方法是始终使用由db自动递增或通过orm自动递增的代理键。在每一张桌子上。这是因为它们通常是连接的快速方法,而且它们使学习数据库变得非常简单,也就是说,所有这些都不是表的无意义键,因为它们都使用相同类型的键。是的,它们可以慢一些,但事实上,设计中最重要的部分是不会随着时间而中断的。这已被证明适用于代理密钥。记住,系统的维护要比开发长得多。为可维护的系统制定计划。而且,对于当前的硬件,潜在的性能损失是可以忽略的。

我不喜欢在每个表上自动增加主键。