Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“多重”;ID";SQL Server数据库中的列?_Sql_Sql Server_Database - Fatal编程技术网

“多重”;ID";SQL Server数据库中的列?

“多重”;ID";SQL Server数据库中的列?,sql,sql-server,database,Sql,Sql Server,Database,通过link,我知道GUID不如聚集索引,但它可以在任何地方唯一创建。它是某些高级SQL Server功能(如复制等)所必需的 如果我想要一个GUID列作为一个典型的主键,这会被认为是糟糕的设计吗?另外,这假设我的集群ID有一个单独的int-identity列,作为额外的奖励,还有一个“用户友好”的ID 更新 看了你的反馈后,我意识到我的问题并没有说对。我知道Guid是一个好的(即使它的杀伤力过大)PK,但通常是一个坏的集群索引。我更直接的问题是,添加第二个“int-identity”列作为集群

通过link,我知道GUID不如聚集索引,但它可以在任何地方唯一创建。它是某些高级SQL Server功能(如复制等)所必需的

如果我想要一个GUID列作为一个典型的主键,这会被认为是糟糕的设计吗?另外,这假设我的集群ID有一个单独的int-identity列,作为额外的奖励,还有一个“用户友好”的ID

更新

看了你的反馈后,我意识到我的问题并没有说对。我知道Guid是一个好的(即使它的杀伤力过大)PK,但通常是一个坏的集群索引。我更直接的问题是,添加第二个“int-identity”列作为集群索引是否不好


我认为Guid将是PK,并使用它来构建所有关系/连接等。然后,我将不使用群集索引的自然键,而是添加一个不特定于数据的附加“ID”。我想知道的是有那么糟糕吗

这是一个不错的设计,集群键的int标识为您提供了许多好处(窄、唯一、升序),同时保持功能性GUID非常独立,并充当主键

如果有什么我会建议你有正确的方法,尽管“用户友好”的ID是最值得怀疑的部分——比如它的用途是什么


附录:我应该把金伯利·特里普(Kimberley Tripp)关于这一主题的文章(可能?)的强制性链接放进去

我认为这样做是不好的设计,但我不知道这样做是否不好。请记住,SQLServer会自动将聚集索引分配给主键。将GUID设为主键后,必须将其删除。此外,您通常希望您的标识列成为主键。因此,按照您所说的去做会让那些不仔细阅读您的代码的人感到困惑。我建议您将ID列作为主键、identity列,并将聚集索引放在其上。然后将GUID列设置为唯一键,使其成为非聚集索引,并且不允许为空。这种影响将做你想做的事,但会遵循更多的标准

使用GUID是懒惰的——也就是说,DBA不愿意为自己的数据正确建模。它还提供了非常糟糕的连接性能——通常是(16字节类型,局部性差)

如果我想要一个GUID列作为我的典型主键,一个单独的int-identity列作为我的集群ID,并作为一个“用户友好”ID的额外奖励,这是一个糟糕的设计吗

是的,这非常糟糕——首先,您不希望表中有多个“人工”候选键。其次,如果您希望用户友好的id用作键,只需使用固定长度的类型,如char[8]或binary(8)——最好是binary,因为排序不会使用区域设置;您可以使用16字节类型,但是您会注意到性能的下降——但是没有GUID的那么差。您可以使用这些固定类型来构建自己的用户友好的分配方案,该方案保留了一些局部性,但生成了合理且有意义的id


例如:

如果您正在编写某种CRM系统(比如说在线保险报价),并且您需要一种非常用户友好的类型,例如看起来像“AD CAR MT 122299432”的保险报价参考(QR)

在本例中——由于引号长度很大——我将创建一个单独的LUT/Symboltable,以将引号引用解析为实际使用的标识符但是我会将此LUT与模型的其他部分分离,我不会在模型中的任何其他地方使用引用,尤其是在表示QR的表中

Create Table QRLut
{
    bigint bigint_id;
    char(32) QR;
}
现在,如果我的模型有一个表表示QR,另外20个表将bigint QR作为外键——使用bigint的事实将允许我的DB很好地扩展——连接谓词越宽,内存总线上引起的争用就越多——内存总线上的争用量决定了CPU的性能饱和(多个CPU)


在本例中,您可能认为可以将用户友好的QR放在实际表示报价的表中,但是请记住SQL server收集表和索引的统计信息,而且你不想让服务器根据用户友好的QR做出缓存决策——因为它庞大且浪费。

我个人认为:

一个内部已知的身份字段 您的PK(用户不知道的PK) 最终用户,因为他们将不可避免地 想以某种方式控制它。)
A 用户友好的“ID”,与 尊重一些商业规则 (在您的应用程序代码或 作为约束)。
中的GUID 如果认为有必要的话 (比如,如果需要 复制)


现在关于聚集索引,您可能会或可能不会混淆,考虑。p> 您打算用GUID实现什么?

int identity
列在该表中也是唯一的。您是否真的需要或预期需要复制的能力?如果是这样,在您的体系结构中使用GUID是否比通过以下方式之一处理标识列更可取


如果您喜欢使用活动记录模式生成的“漂亮”ID,那么我想我会尝试使用它而不是GUI。如果确实需要复制,则使用适用于标识列的复制策略之一。

考虑只使用GUID,但使用该方法获取GUID(该方法分配顺序值,因此不会出现与该方法相同的群集性能问题)

使用辅助INT键作为索引的问题是,如果它是一个适当的索引,为什么要使用GUID呢?如果需要GUID,如何使用INT索引?我不确定你是否