首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在MS SQL中使用GUID作为主键是不是一个坏主意?

在MS SQL中使用GUID作为主键是否是一个坏主意这个问题,需要从多个方面来考虑。

首先,GUID是全局唯一标识符,它是一个128位的数字,通常用于在分布式系统中唯一标识数据记录。在MS SQL中,GUID是一个内置的数据类型,可以直接用作主键。

然而,使用GUID作为主键也有一些缺点。首先,GUID的长度较长,占用的存储空间比整型或其他简单数据类型要大,这可能会导致数据库的性能下降。其次,GUID是随机生成的,因此它们在数据库中的插入顺序是无序的,这可能会导致数据库的索引效率降低。最后,GUID的生成算法可能会导致一些安全问题,因为它们可能会泄露有关系统的一些信息。

尽管如此,在某些情况下,使用GUID作为主键还是有一些优势。例如,在分布式系统中,使用GUID作为主键可以确保每个数据记录都有一个全局唯一的标识符,这在处理数据复制和数据同步时非常有用。

综上所述,使用GUID作为主键是否是一个坏主意,需要根据具体情况来考虑。如果您的数据库需要处理大量的数据记录,并且需要高效的索引和存储空间,那么使用GUID作为主键可能是一个不好的选择。但是,如果您的数据库需要处理分布式系统中的数据复制和数据同步,那么使用GUID作为主键可能是一个合适的选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

数据库模型设计——主键的设计

通常情况下,RDBMS会在主键上建立聚集索引(SQL Server默认都这么做),由于我们使用B-Tree的数据结构来存储索引数据,所以一般对主键有以下两个要求: 越短越好——越短一个Page存储的节点越多...GUID类型SQL Server是16个字节,不算短,比4个字节的Int32长多了。...个人建议是不要使用任何有业务含义的字段作主键,而是使用一个自增的(或者系统生成的)没有实际业务意义的字段作为主键。为什么呢?...前面已经说到主键应该越短越好,而且是建议是一个没有意义的自增列,那么是不是就不会再需要联合主键呢?答案是否定的,我们仍然可能会使用到联合主键。...另外还有一个唯一约束(索引)的概念,该索引的数据必须是唯一不能重复的,感觉和主键的意义一样,但是还是有一点点区别。 主键是只能由一个,而唯一约束(索引)一个可以有多个。

95930

关于Int自增字段和GUID字段的性能测试。只有测试,没有分析,呵呵

最近有两篇关于GUID和Int自增的文章,我是一直使用Int自增的,不习惯使用GUID,感觉GUID很麻烦,用着不方便,性能也比不上Int自增。...2、 软件       Windows 2003 Server       SQL Server 2000 二、 测试目的 1、 测试多表关联的时候Int自增和GUID的性能对比。...主键、外键是Int自增 VS 主键、外键是GUID。       对比一下多表关联的情况下,二者的性能如何?       疑问:聚集索引是否都要设置到哪里?       ...第一组表用Int作为主键,第二组表以GUID作为主键。字段嘛,咱们就简单一点吧。 【客户信息表】 客户ID、客户名称、地址、添加时间。 其中 客户ID 是主键、聚集索引、 Int自增。...其中 合同ID 是主键、聚集索引、GUID。 3、 添加测试数据。       客户信息6.5万,合同信息26.2万。每一个客户都有4条合同信息。

1.1K100

sql server 聚集索引,非聚集索引,Identity ,gudi,主键的概念和比较

gudi 全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于拥有多个节点、多台计算机的网络或系统。... Windows 平台上,GUID 广泛应用于微软的产品,用于标识如注册表项、类及接口标识、数据库、系统目录等对象。...主键 通常选择自增int作为主键,除非有特殊需要,并且还让SQL Server自动生成/维护该字段。...因为主键默认是聚集索引,所以我们再使用guid作为主键的时候数据量比较大的话就有性能问题。...但是如果数据量小就放心的使用吧,但是如果是分布式的数据库,又不能用int作为主键怎么办,这个时候我们可以选择两种方式混合用,再自己的数据库用int 这样查询和修改就比较快,同时使用guid作为唯一标识,

73230

【BCVP升级】泛型主键使用

今天继续推进BCVP项目的往下进行,新开了一个需求,这个需求来自于网友的提问:目前BlogCore项目默认使用的是int作为主键,并自增,平时开发的时候int或者long这个都是很常见的,但是如果说,我就不想用...所以我就尝试了这个新课题:使用泛型主键,这样拿到这个项目的时候,自己修改下主键类型,就可以运行了,不过目前还没有百分百完善,int主键已经调通,其他类型主键,比如Guid或者自定义string还没有完成生产化...做这个需求的目的,一是为了灵活框架,二也是为了给大家提供一个思路。 别一上来就说没用,你可以不用我的框架,但是这个思路还是可以了解下的,平时ORM是如何控制的,而且泛型项目开发的作用特别大。...2、设计泛型主键结构 实体基类增加泛型参数 上边我们已经重新设计了一个实体基类,它的基础上,我们可以先增加一个泛型参数: public class RootEntityTkey where...(new Advertisement()); 3、注意仓储执行方法 因为之前我们都是使用的int作为主键,然后用的.ExecuteReturnIdentityAsync()方法,这样返回的是对应的id。

64410

SQL Server数据库高级进阶之分布式唯一ID生成实战演练

(主要是索引查询销量不是最高的) 如果非要使用非自主增长列作为主键的话(分布式系统分库分表),推使用有序UUID和有序的整长的Rowid(雪花算法snowflake和MongoDB之ObjectId...参考资料:为什么要使用自增ID作为主键 - Mr-blue - 博客园 https://www.cnblogs.com/lanqi/p/10185172.html 二、SQL Server分布式唯一...ID生成实战演练 唯一ID可以标识数据的唯一性,分布式系统中生成唯一ID的方案有很多,常见的方式大概有以下三种: 2.1、依赖数据库,使用SQL SERVER无序UUID和有序UUID。...特别是分布式系统,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。...snowflake是twitter开源的分布式ID生成算法,其核心思想是:一个long型的ID,使用其中41bit作为毫秒数,10bit作为机器编号,12bit作为毫秒内序列号。

1.1K30

SQL Server数据库高级进阶之分布式唯一ID生成实战演练

(主要是索引查询销量不是最高的) 如果非要使用非自主增长列作为主键的话(分布式系统分库分表),推使用有序UUID和有序的整长的Rowid(雪花算法snowflake和MongoDB之ObjectId...参考资料:为什么要使用自增ID作为主键 - Mr-blue - 博客园  https://www.cnblogs.com/lanqi/p/10185172.html 二、SQL Server分布式唯一...ID生成实战演练 唯一ID可以标识数据的唯一性,分布式系统中生成唯一ID的方案有很多,常见的方式大概有以下三种: 2.1、依赖数据库,使用SQL SERVER无序UUID和有序UUID。...特别是分布式系统,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。...snowflake是twitter开源的分布式ID生成算法,其核心思想是:一个long型的ID,使用其中41bit作为毫秒数,10bit作为机器编号,12bit作为毫秒内序列号。

2K20

我在工作中使用的自己实现的超简易ORM工具

7月份到了家新公司,要维护一个原来.net1.1上的系统。...,决定自己动手,自己搞一个,遂自己瞎糊弄了一个项目中用了,感觉良好,嘿嘿,先不多说,把代码统统拷上来: //wxy create at 2008-8-31 //自己实现了一个简易的ORM工具,方便数据库操作...>   Guid,   ///    /// 生成一个可以排序的Guid   ///    GuidComb,      ///    /// 主键值由用户指定...其实基本的思路非常简单,就是定义了三个 attribute, 一个指示是一个表,一个指示是主键一个指示字段,顺便指定字段的类型。...,呵呵        实现这个的时候,主要遇到了这么几个问题:Castle ActiveRecord 的 SessionScope 只要声明了一个,以后的数据连接就自动都会使用它,我一直没搞明白他是怎么做到的

1.6K80

uniqueidentifier什么意思_数据类型int是什么意思

GUID主要用于在用于多个节点,多台计算机的网络,分配必须具有唯一性的标识符。 SQL ROWGUIDCOL表示新列是行的全局唯一标识列。...对于每个表只能指派一个uniqueidentifier 列作为ROWGUIDCO列。...七 系统数据库的设计我们如何对Uniqueidentifier,Identity ,和可标识的记录属性(有实际的含义的信息)作为主键 ,这三种方式 进行取舍   以属性为主键的系统设计情况   ...系统设计的过程   单条信息包含可以表示唯一性的属性(一般不能太多3个以内)而且这样的属性是必填字段。...列为主键的情况   需要多个数据库之间,多个网段之间需要进行数据库的复制时,我们就需要在每一个唯一的标识来区别每一个单条记录,没有合适的属性来做主键的情况下可以用Uniqueidentifier

1.4K30

Hibernate 主键介绍

特点是与底层数据库有关,要求数据库支持Identity,如MySQL是auto_increment,SQL Server 是Identity,支持的数据库有MySQL、SQL Server、DB2、...---- Hilo: Hilo使用高低位算法生成主键,高低位算法使用一个高位值和一个低位值,然后把算法得到的两个值拼接起来作为数据库的唯一主键。Hilo方式需要额外的数据库表和字段提供高位值来源。...特点是需要额外的数据库表的支持,能保证同一个数据库主键主键的唯一性,但不能保证多个数据库之间主键的唯一性。...特点是能够保证数据库主键的唯一性,生成的主键占用比较多的存储空间。 ---- Foreign GUID: Foreign用于一对一关系。...GUID主键生成方式使用了一种特殊算法,保证生成主键的唯一性,支持SQL Server 和MySQL.

64120

【MyBatis框架点滴】——mybatis插入数据返回主键(mysql、oracle)

https://blog.csdn.net/huyuyang6688/article/details/51428427   向数据库插入数据时,大多数情况都会使用自增列或者UUID做为主键。...主键的值都是插入之前无法知道的,但很多情况下我们插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A、B插入数据(A的主键是B的外键),向A表插入数据之后,向B表插入数据时需要用到A的主键。...主键为UUID时(主键必须为字符类型)   使用mysql的方法UUID()方法获取随机的UUID作为主键,select UUID()可以插入数据前,生成随机的UUID并通过keyProperty赋值给将要插入记录的主键...背 景数据库为oracle: 主键为自增时(主键为数值类型):   oracle实现主键自增,需要先创建序列,相当于创建一个全局变量,用来存储对应表的主键的当前最大值(主键为数值类型时)。   ...UUID时   用oracle自带的SYS_GUID()方法获得随机的GUID作为主键: <insert id="insertUser" parameterType="com.danny.mybatis.po.User

1.9K20

基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则

对于习惯使用 EF Core 和 关系数据的开发者来说,这看起来似乎有些奇怪。获取 Issue 的所有数据是没有必要且低效的。为什么我们不直接执行一个SQL插入命令到数据库,而不查询任何数据呢?...因此,当你得到一个聚合时,所有的子集合已经作为查询的一部分被检索出来了,不需要任何额外配置。 ABP框架有助于您的应用程序实现这一原则。...现实生活一个角色可能被分配给数以千计(甚至数以百万计)的用户,每当你从数据库查询一个角色时,加载数以千计的数据项是一个重大的性能问题。记住:聚合是由它们的子集合作为一个单一单元加载的。...聚合根/实体主键 一个聚合根通常有一个ID属性作为其标识符(主键,Primark Key: PK)。推荐使用 Guid 作为聚合根实体的PK。 聚合的实体(不是聚合根)可以使用复合主键。...另一方面,例如:MongoDB,你根本不需要为子集合实体定义主键,因为它们是作为聚合根的一部分来存储的。 聚合根/实体构造函数 构造函数是实体的生命周期开始的地方。

2.9K30

性能优化方案

性能优化方案 首先找到慢的即可,确认是请求慢还是响应慢, 然后确认是不是接口慢,减少多余数据的传输。 接口优先排查sql慢,如果不确定哪一步慢,可以使用stopwotch监控。...然后针对性的优化 数据库性能优化 能用数值型的就不要用字符串的,字符串尽量短小 减少多表连接 逻辑查询优化 sql优化 减少多表连接 等价sql写法替换 比如substring 和like,用like能好...物理优化 最常见的是:索引 重复度超过10%的,一般就不建议建立索引了 使用索引列不要有计算函数,否则索引失效 加缓存 分库分表 数据量达到亿级别时考虑 能不分就不分!!!...水平拆分 按照属性拆分 比如年份 拆表 垂直拆分: 按业务分库,相同业务一个库, 拆成订单表 订单子表 所有 分库分表带来的问题 事务一致性问题(跨库跨表事务问题) 跨库跨表联查问题 水平切分的表...排序和分页的问题 自增主键问题 GUID 也会重复(单机不重复,集群下在不同服务器有极少概率重复,500w分之一, 但是亿级别下就不容小视了)==【雪花算法】== 历史数据迁移问题 分库分表的问题如何解决

33920

细分主键

主键本身是很简单的,但是围绕他产生的故事就不是那么简单了。 1、 管理 这个是最重要的,没有规矩不成方圆,主键要如何管理一定要实现确定好了,甚至有必要为此写一个规范。...2、 定义 不是说“主键”这个词的定义,而是主键用什么,比如用GUID还是用int,还是年月日时分秒+流水? 3、 生成 主键用什么确定好了之后就是如何生成了。...比如GUID,是程序里生成,还是由数据库的字段默认值来生成?采用无序的GUID还有有序的GUID?再比如int,是采用MSSQL 的自增,还是自己管理。...如果自己管理的话,那么是写一个存储过程还是代码里面写个函数(类)? 4、 安全 1,2,3,4这种主键是否够安全?是不是因为不安全就不能用了?一定要改成GUID才行?...那么改成GUID了,是否还需要进行安全判断?什么情况下可以用int,什么时候不能用(因为安全原因)? 5、 效率 主键要不要设置索引?聚集的还是非聚集的,还是不用索引?

64860

SQL反模式学习笔记22 伪键洁癖,整理数据

1、不按照顺序分配编号 插入新行时,通过遍历表,找到的第一个未分配的主键编号分配给新行,来代替原来自动分配的伪主键机制。...缺点:(1)SQL语句比较麻烦;        (2)必须同时更新所有引用了你重新分配了主键的行的子记录;        (3)无法避免产生新的断档。   ...3、制造数据差异     如果别的外部系统依赖于数据库主键来定义数据,那么你的更新操作就会导致那个系统的引用失效。     ...如何识别反模式:当出现以下情况时,可能是反模式   1、我回滚了一个插入操作后,要怎么重用囊而自动生成的标识? 伪键一旦生成后不会回滚。...1、定义行号:使用Row_Number()或者Limit等关键字来实现;   2、使用Guid:数据库全局唯一标识符。

74530

Linq查询连接guid与varchar字段

使用场景 在数据库设计中进场会出现一些通用表,如通用附件表,一般都是通过ForeignTable(关联的表名)和ForeignKey(关联表的主键)与其他表关联。...这样的表在数据库没有外键关系,而且一般ForeignKey的类型是varchar,为了兼容其他表的主键可能不一样。...这样Linq查询的时候就不能直接关联了,如下代码会编译不通过: from a in db.WorkflowInstance join b in d.xxx//xxx.ID为guid类型 on new...但是Guid不行,因为没有对应的函数。通过面向百度编程,微软爸爸给我们提供了一个解决方案:自定义函数。相当于我们自己实现一个SqlFunctions.StringConvert()。...添加自定义函数对应的方法 /// /// sql函数Guid转varchar /// /// /// <returns

1.3K20

Mybatis-Plus3.0默认主键策略导致自动生成19位长度主键id的坑

因此,决定一步步定位,先给Mybatis-Plus打印出sql日志,看下其insert语句是否自动生成了一个id,然后才插入数据库。...[image.png] 到这里,就确定,这个长数字的id,是代码层次就自动生成了,最后进入对应的实体类,发现该映射数据表的id字段,并没有显示设置对应的主键生成策略。...其核心思想:使用41bit作为毫秒数,10bit作为机器的ID(5bit数据中心,5bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每个毫秒可以产生4096个ID),最后还有一个符号位...接下来,先验证Mybatis-Plus默认主键策略是如何的。 Mybatis-Plus项目启动时,会对注解实体类进行初始化,然后缓存到系统Map。...这里,只需要关注Mybatis-Plus源码TableInfoHelper类的initTableInfo方法即可,这个方法项目启动时会被调用,然后初始化所有注解@TableName的实体类。

4.5K130
领券