我正在争论是否更好地做一个 PRIMARY KEY 从一个 身份列, ,我们从明确生成唯一ID的UDF中出来的。

  • 我正在争取身份列。
  • 他声称,我的伴侣正在主张手动产生价值
    • 通过将UDF放在我们可以拥有UDF的另一个表上
      • 锁定资源
      • 用一个称为一个字段的字段递增一个ID表 ID_Value 经过 1
      • 将其用作全球唯一标识符
    • 或让桌子做一个 id+1 插入时
    • 在服务器和/或没有识别约束的环境之间移动数据是更简单的;从一个数据库移动到有数据到另一个类似的DB,并说分阶段或虚拟数据。为了进行非生产测试,我们可能希望将所有记录从昨天撤下到舞台上进行测试。

哪种实现更有意义?

有帮助吗?

解决方案

您的同事是个白痴。

该解决方案将无法扩展,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/

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top