Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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
Sql server 2005 版本号格式的主键的SQL数据类型_Sql Server 2005_Types_Primary Key - Fatal编程技术网

Sql server 2005 版本号格式的主键的SQL数据类型

Sql server 2005 版本号格式的主键的SQL数据类型,sql-server-2005,types,primary-key,Sql Server 2005,Types,Primary Key,我正在处理的表有一个主键,它本质上是一个版本号。以下是几个版本号示例: 1.0.0.0 1.1.2.24 Varchar对我来说似乎是最明显的选择,但我希望将主键设置为聚集索引-我在SQL性能站点上读到,由于分页问题,您应该避免在聚集主键中使用Varchar 如果版本号是可变长度的,那么最适合列的数据类型是什么 我正在处理的这个数据库正在运行SQLServer2005 谢谢您的帮助。好吧,您可以始终使用四个整型字段-主,次,发布和构建-一起使用,它们是16个字节,就像GUID一样-还不错 这种

我正在处理的表有一个主键,它本质上是一个版本号。以下是几个版本号示例:

1.0.0.0
1.1.2.24
Varchar对我来说似乎是最明显的选择,但我希望将主键设置为聚集索引-我在SQL性能站点上读到,由于分页问题,您应该避免在聚集主键中使用Varchar

如果版本号是可变长度的,那么最适合列的数据类型是什么

我正在处理的这个数据库正在运行SQLServer2005


谢谢您的帮助。

好吧,您可以始终使用四个整型字段-
发布
构建
-一起使用,它们是16个字节,就像GUID一样-还不错

这种方法的唯一缺点是,如果需要在外键约束中引用此表,通常必须在所有四个表上进行连接

我不会使用VARCHAR-INT更好(通常更快)。此外,由于VARCHAR的可变特性,事情可能会变得有点混乱(VARCHAR字段可能会增长并导致各种问题,而INT始终保持在4字节)


另一个非常流行的选项是,将这四个字段用于实际版本,并添加一个代理项
VersionID INT IDENTITY
,以获得最佳的集群密钥性能。

您可以引入代理项密钥(例如,IDENTITY INT值)并在版本号列上放置唯一约束


或者,在您的情况下,性能问题可能不是很大的开销,您可以将版本号作为主键。

格式要求有多严格?如果必须是“1.0.0.0”,那么实际上只有varchar和char作为选项——但这只是问题的开始(“1.0.0.10”将在“1.0.0.2”之前排序)


如果您可以强制使用一个固定的大小,比如“001.000.000.010”,那么您就可以使用一个char(15)字段来解决您的问题。

您是否尝试过将单个VARCHAR列的性能与4个int列进行比较,以了解其区别?此版本列的长度有多大?是varchar(8000)还是更小的?这个表将有多忙,有多少外键将被引用?@Damien-事实上,它在每个位置的增长永远不会超过3位数@astander,我还没有到设计阶段,我已经考虑过char路由,但是它比子表中的IDENTITY int路由重得多。感谢对外键的进一步说明。连接肯定会有问题。使用4xint来描述版本控制,并使用VersionID INT标识作为集群键。再次感谢。考虑到需要在外键中引用表,这看起来相当不错。结合使用int作为主要的次要发布和构建元素可能会奏效。