我正在辩论是否更好地PRIMARY KEY
使用Identity Columns,我们使用显式生成唯一 ID 的 UDF。
- 我正在为身份列争论。
- 他声称,我的伙伴正在争论手动生成值
- 通过将 UDF 放在另一个可以有 UDF 的表上
- 锁定资源
- 增加一个 ID 表,其中一个字段
ID_Value
由1
- 将此用作全局唯一标识符
- 或者让表格
id+1
在插入时执行 - 在没有识别约束的服务器和/或环境之间移动数据更简单;从一个有数据的数据库移动到另一个类似的数据库,比如说暂存或虚拟数据。对于非生产环境中的测试,我们可能希望将昨天的所有记录拉下来进行测试。
- 通过将 UDF 放在另一个可以有 UDF 的表上
哪种实现更有意义?
你的同事是个白痴。
该解决方案将不可扩展,UDF 不是并发的(与此相同的原因)。以及如何处理多行插入:这需要每行调用一次 UDF
并且迁移到其他 RDBMS 在现实生活中并不经常发生……您现在最好不要使用 SQL Server,而在 Oracle 上使用序列,希望您不要迁移。
编辑:
您的更新声明移动数据用于刷新非生产数据库。
在这种情况下,刷新时会忽略标识列。你不会为了让非产品加载更容易而牺牲你的实现。或者使用临时表来跟踪标识值的变化。
或者使用流程:我们每天晚上从生产中更新我们的测试系统,这完全避免了这个问题。(并确保我们的产品备份也可以恢复)
使用标识值。生成自己的序列表和序列值会占用大量开销,并在尝试生成数字时导致大量锁定和阻塞。
身份存在是有原因的,使用它。
当 SQL Denali 出现时,它将支持比身份更有效的序列,但您无法自己创建更高效的东西。
至于将记录从一个环境移动到另一个环境,要么在插入时打开 IDENTITY_INSERT,要么选中 SSIS 中的框。
身份列对我来说听起来不错。我不确定我是否遵循关于为什么难以在服务器之间移动数据的逻辑。
如果您确实希望每一行都具有全局唯一标识,则可以使用 UUID,但除非您确定全局唯一性是必要的,否则我不会这样做 - 通常不是。使用 UUID 作为 id 会降低性能,增加磁盘空间需求并使调试变得更加困难 - 因为 UUID 的长度很难记住,很难通过电话告诉别人,或者把它写在纸上而不会出错。
对于简单的数字 ID,只需使用身份即可,忘记手动生成它们的所有问题。
您始终可以创建一个使用身份作为 PK 并具有类型列和任何其他信息的“超级表”。当您需要一个新 ID(假设您的意思是跨不同表的唯一 ID)时,只需插入此表并抓取
SCOPE_IDENTITY()
然后插入您需要的实际表中。基本上,您创建一个表:具有标识 PK 的MasterID,当您需要在 Table1 中插入一行时,
INSERT INTO MasterIDs
使用该行生成的标识,然后使用该值作为 PKSCOPE_IDENTITY()
插入Table1 。Table1将有一个非身份的 int PK。您将执行相同的过程来插入 Table2 等。让 SQL Server 管理MasterIDs表中的标识值,然后您可以在其他表中使用它。 MasterID可以包含其他表,例如类型(因此您可以知道哪个表、Table1 或 Table2 等使用该标识值。
只要您正确使用外键约束(级联、更新等),那么您就可以使用标识字段。在这种情况下,我真的没有看到其他解决方案的优势。
身份是根据您的情况制作的。您拥有用于服务器/环境数据交换的复制等工具,可以将它们保持在一起。
我刚刚完成了一项工作,我
identity
用一个普通int
字段替换了一个 SQL Server 列,并自己控制了 Id 分配。我已经看到了相当可观的性能提升。与 OP 不同,我没有 UDF 来生成 id。但原理几乎相同:软件的一部分维护了一个 id 池。当它们用完时,它会通过查询数据库获取下一个Low值并将其增加到下一个High来获得另一批。
这允许我们在将批次提交到数据库之前生成 ID 并关联 ORM 中事务之外的所有实体,并且还可以提交更大的批次而无需额外的往返来获取刚刚插入的身份(身份列需要)。
在 id 表中,我们有不止一行,如果我们愿意,我们可以使用特定的范围。即用于重用已删除的块和负ID。
我多年来一直在使用身份,并认真考虑用 UNIQUEIDENTIFIER 替换身份号码。如果有人将其设计为紧凑型数据库,则需要更改数据类型是一场噩梦,如果您需要将身份添加到列中,那将是一场噩梦,而且您无法更新身份列。想象一下,你放了一个 int 并且你的数据库增长到超过 20 亿条记录,这又是改变的噩梦(考虑 FK)!改变任何有身份的东西都是一场噩梦,除非你放 bigint,否则对规模不友好!UNIQUEIDENTIFIER vs Identity = 便利性和稳健性 vs 可能显着的性能改进(没有做基准测试)。
更新:在我看到这个之后,我肯定倾向于 UNIQUEIDENTIFIER。这表明 bigint 身份没有真正的好处,而 UNIQUEIDENTIFIER 有很多好处!不同版本的 SQL Server 可能会产生不同的结果。在所有数据库和系统中拥有一个唯一的 id 就是一种美(健壮性)!随心所欲地移动、复制、转换数据! https://www.mssqltips.com/sqlservertip/5105/sql-server-performance-comparison-int-versus-guid/