PK作为ROWGUIDCOL还是使用单独的rowguid列?


9

这里正在进行一场激烈的辩论,所以我想听听其他意见。

我有很多带有uniqueidentifier集群PK的表。这是否是一个好主意在这里超出了范围(并且不会很快改变)。

现在,必须合并发布数据库,并且DEV提倡使用单独的rowguid列,而不是将现有PK标记为ROWGUIDCOL。

基本上,他们说应用程序永远不应将仅用于复制的内容带入其域(对于他们来说,这只是“ DBA内容”)。

从性能的角度来看,我没有理由为什么要添加一个新列来执行现有列可以做的事情。而且,由于它只是“ DBA的东西”,为什么不让DBA选择?

我有点理解DEV的观点,但是我仍然不同意。

有什么想法吗?

编辑:我只是想补充一点,在这场辩论中我是少数派,而质疑我立场的DEV是我尊敬和信任的人。这就是我诉诸意见的原因。
我可能还缺少一些东西,可能会误解了他们的观点。


将来是否有可能需要更改PK值?
罗伯特·L·戴维斯

不,不是。这是一个代理键,因此该应用程序实际上并没有对该列做太多事情。它永远不会改变,也永远不会显示给用户。
spaghettidba

他们为什么要一个单独的rowguidcol?而且,如果可以的话,他们通常会选择哪种方案作为PK,为什么?
JustinC

@spaghettidba说到跨域,您多久告诉他们在应用程序代码中应该或不应该使用哪种设计模式?也许他们应该坚持自己的“领域”?;-)。此外,在所有表中添加16字节的列对于性能而言将是可怕的,并且没有任何好处。
所罗门·鲁茨基

Answers:


7

基本上,他们说应用程序永远不应将仅用于复制的内容带入其域(对于他们来说,这只是“ DBA内容”)。

我完全同意。但是......主键是不是只用于复制(大概是应用程序使用它的一些方式)。在这种情况下,该论点毫无意义。

据我所知,无论如何,“ DBA素材”只有两种方式可以越过域边界:

  1. 如果应用程序正在使用引用该ROWGUIDCOL列的查询,如下所示:

    DECLARE @a table (id uniqueidentifier ROWGUIDCOL);
    
    SELECT ROWGUIDCOL FROM @a;
    

    我假设您的所有列都没有此属性,所以应用程序不会这样做。(顺便说一下,这ROWGUIDCOL是与复制完全不同的概念。碰巧的是,合并复制使用了复制。)

  2. 主键列将不再可更新。如果应用程序正在执行此操作,并且不打算使用其他算法进行更改,则别无选择,只能在表中添加新列,因此无需讨论。

除这些行为外,该ROWGUIDCOL属性是完全透明的。您可以添加它,而应用程序将永远不会知道。任何类型的数据复制方案都应对应用程序尽可能透明。


谢谢回答。不,应用程序没有执行1.或2.出于完整性考虑,某些表已经用PK中的ROWGUIDCOL属性进行修饰。
spaghettidba

尽管我同意复制对于应用程序应该是透明的,但我也认为必须考虑从根本上进行复制的数据库。例如,合并复制中的身份管理完全是PITA:如果您从一开始就知道必须进行合并发布,那是一回事。
spaghettidba

@spaghettidba:是的,我完全同意,如果要进行复制,则肯定要为其设计数据库。通常,仅遵循最佳实践即可达到目标。丑陋,多毛的遗留数据库往往会遇到最多的设计问题。根据我的经验,特别是合并复制比其他任何复制机制都更具挑战性。
乔恩·塞格尔

@spaghettidba和Jon:仅供参考,至少从SQL Server 2008 R2(搜索FeatureID 182)开始,就不再支持ROWGUIDCOL在该上下文中(即不在CREATE TABLE/ ALTER TABLE语句中)使用。$ROWGUID
所罗门Rutzky

6

我同意。只要不需要更改PK值,那么最好使用现有的uniqueidentifier列作为rowguidcol。


5

“基本上,他们说应用程序永远不应将仅由复制使用的东西带入其域(对于他们来说,这只是“ DBA东西”)。”

但是它不仅用于复制。它也是(并且已经是)您的PK。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.