明确生成唯一ID的身份列或UDF?
-
16-10-2019 - |
题
我正在争论是否更好地做一个 PRIMARY KEY
从一个 身份列, ,我们从明确生成唯一ID的UDF中出来的。
- 我正在争取身份列。
- 他声称,我的伴侣正在主张手动产生价值
- 通过将UDF放在我们可以拥有UDF的另一个表上
- 锁定资源
- 用一个称为一个字段的字段递增一个ID表
ID_Value
经过1
- 将其用作全球唯一标识符
- 或让桌子做一个
id+1
插入时 - 在服务器和/或没有识别约束的环境之间移动数据是更简单的;从一个数据库移动到有数据到另一个类似的DB,并说分阶段或虚拟数据。为了进行非生产测试,我们可能希望将所有记录从昨天撤下到舞台上进行测试。
- 通过将UDF放在我们可以拥有UDF的另一个表上
哪种实现更有意义?
解决方案
您的同事是个白痴。
该解决方案将无法扩展,UDF不合时间(与此相同的原因)。以及您如何处理多排插入物:这将需要每行UDF调用
在现实生活中,迁移到其他RDBM的发生不经常发生...您现在也可能不使用SQL Server并在Oracle上使用序列,并希望您不要迁移。
编辑:
您的更新指出,移动数据用于刷新非生产数据库。
在这种情况下,您会在刷新时忽略身份列。您不会损害实施方式,以使非生产加载更加容易。或使用临时表跟踪身份值更改。
或使用过程:我们每晚从生产中刷新测试系统,从而完全避免了问题。 (并确保我们的产品备份也可以恢复)
其他提示
使用身份值。生成自己的序列表和序列值将需要大量开销,并在尝试生成数字时会引起很多锁定和阻塞。
存在身份是有原因的,请使用它。
当SQL Denali出来时,它将支持比身份更有效的序列,但您无法创建更有效的东西。
至于将记录从一个环境移动到另一个环境,请在执行插入时打开Identity_insert,或在SSIS中选中该框。
身份列对我来说听起来不错。我不确定我遵循有关为什么很难在服务器之间移动数据的逻辑。
如果您确实希望每行具有全球唯一的身份,则可以使用UUID,但是除非您确定全局唯一性是必要的,否则我不会这样做 - 通常不是。将UUID用作ID将降低性能,增加磁盘空间的需求并使调试更加困难 - 由于长度很难记住UUID,通过电话告诉某人或在纸上写下来,而不会出错。
对于简单的数字ID,只需使用身份,而忘记了手动生成它们的所有问题。
您始终可以创建一个使用身份作为PK并具有类型列以及任何其他信息的“超级表”。当您需要一个新ID时(假设您是指在不同表之间的唯一ID),只需插入该表格并抓住 SCOPE_IDENTITY()
然后插入所需的实际表中。
基本上您创建一个表: Masterids 使用身份PK,当您需要将一行插入表1时 INSERT INTO MasterIDs
并使用该行生成的身份 SCOPE_IDENTITY()
然后插入 表格1 使用该值作为PK。
表格1 将有一个非身份int pk。您将执行相同的过程以插入表2等。让SQL Server管理在 Masterids 表,然后您可以在其他表中使用。 Masterids 可以包含其他表,例如类型(因此您可以知道哪个表1或表2等使用该身份值。
只要Asyou正确使用外键约束(级联,更新等),那么使用身份字段就可以了。在这种情况下,我真的看不到其他解决方案的优势。
标识是为了适合您的情况。您拥有诸如服务器/环境数据交换的复制之类的工具,可以将其全部保持在一起。
我刚刚完成了我更换SQL Server的工作 identity
列正常 int
本身和控制ID分配。
我看到了令人印象深刻的表现。与OP不同,我没有UDF生成ID。但是原理几乎是相同的:软件中有一部分维护ID池。当他们用完时,通过查询下一个数据库,将获得另一批 低的 价值并将其递增到下一个 高的.
这使我们能够生成ID并关联ORM中交易之外的所有实体,然后再将批次提交到数据库中,并在没有额外的往返的情况下提交大批批次以获取身份(身份列要求)。
在ID表中,我们有不止一行,允许我们使用特定的范围。即重复使用已删除的块和负ID。
我已经使用了多年的身份,并认真考虑用独特的身份验证器代替身份号码。如果您将其设计为紧凑的数据库和噩梦,则需要更改数据类型时,这是一场噩梦,如果您需要在列中添加身份,此外,也无法更新身份列。想象一下,您放置了一个INT,数据库的增长超过了200亿张唱片,再次噩梦要更改(考虑FKS)!用身份改变任何东西都是一场噩梦,除非您将BigInt放置,否则不友好!唯一的Ididentifier vs Identity =便利性和鲁棒性与可能明显的性能提高(没有进行基准测试)。
更新:我看完之后 这个 我绝对倾向于独特的身份。这没有显示出bigint身份的真正好处,也没有对独特身份的一堆好处! SQL Server的不同版本可能具有不同的结果。在所有数据库和系统中拥有独特的ID(鲁棒性),这只是美!移动,复制,转换数据!https://www.mssqltips.com/sqlservertip/5105/sql-server-performance-comparison-int-versus-guid/