gpt4 book ai didi

sql - *不*使用 GUID 作为主键的原因是什么?

转载 作者:行者123 更新时间:2023-12-03 03:27:48 24 4
gpt4 key购买 nike

每当我设计数据库时,我都会自动为每个表(查找表除外)自动生成 GUID 主键

我知道我永远不会因为重复键、合并表等而失眠。对我来说,从哲学上讲,任何给定的记录在所有域中都应该是唯一的,并且这种唯一性应该以一致的方式表示表到表。

我意识到它永远不会是性能最好的选择,但抛开性能不谈,我想知道是否有反对这种做法的哲学论据?

根据大家的回复,让我澄清一下:

我所说的是始终使用 GUID 代理键作为主键 - 无论是否以及如何在表上设计任何自然键或顺序键。这些是我的假设:

  1. 可以设计基于自然键的数据完整性,但不能假设。
  2. 主键的功能是引用完整性,与性能、排序或数据无关。

最佳答案

GUID 似乎是主键的自然选择 - 如果您确实必须这样做,您可能会争论将其用作表的主键。

我强烈建议不要这样做,即使用 GUID 列作为聚集键,这是 SQL Server 默认执行的操作,除非您明确告诉它不要这样做。造成这种情况的主要原因确实是性能,它会在路上困扰你......(它会的,相信我 - 只是时间问题) - 而且还浪费资源(SQL Server 中的磁盘空间和 RAM)机)这确实没有必要。

您确实需要分开两个问题:

1) 主键是一个逻辑结构 - 唯一且可靠地标识表中每一行的候选键之一。这实际上可以是任何东西 - INT、GUID、字符串 - 选择最适合您的场景的内容。

2) 聚集键(定义表上“聚集索引”的一列或多列) - 这是一个物理与存储相关的东西,在这里,小型、稳定、不断增加的数据类型是您的最佳选择 - INT 或 BIGINT 作为您的默认选项。

默认情况下,SQL Server 表上的主键也用作聚簇键 - 但不必如此!我个人看到,将以前基于 GUID 的主键/聚集键分解为两个单独的键 - GUID 上的主(逻辑)键和单独的 INT IDENTITY(1, 1)专栏。

Kimberly Tripp - 索引女王 - 和其他人已经说过很多次 - GUID 作为集群键并不是最佳的,因为由于它的随机性,它将导致大量页面和索引碎片以及通常较差的性能。

是的,我知道 - SQL Server 2005 及更高版本中有 newsequentialid() - 但即便如此,它也不是真正且完全顺序的,因此也会遇到与 GUID 相同的问题 - 只是有一点点不太明显。

然后还有另一个问题需要考虑:表上的聚集键也将添加到表上每个非聚集索引的每个条目中 - 因此您确实希望确保它尽可能小。通常,具有 2+ 十亿行的 INT 对于绝大多数表来说应该足够了 - 与作为集群键的 GUID 相比,您可以在磁盘和服务器内存中节省数百兆字节的存储空间。

快速计算 - 使用 INT 与 GUID 作为主键和聚类键:

  • 具有 1'000'000 行的基表(3.8 MB 与 15.26 MB)
  • 6 个非聚集索引(22.89 MB 与 91.55 MB)

总计:25 MB 与 106 MB - 而且这只是在一个表上!

还有一些值得深思的东西 - Kimberly Tripp 写的很棒的东西 - 读它,再读它,消化它!这确实是 SQL Server 索引福音。

马克

关于sql - *不*使用 GUID 作为主键的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3050771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com