使用GUID作为数据表主键的好处(转)
分类: 数据库开发技术
使用GUID作为数据表主键的好处
[@more@]
使用GUID作为数据表主键的好处
数据表主健通常采用以下三种方式:
1. 自动递增值。
2. 唯一名称。这个是使用自己定义的算法来生成一个唯一序列号。
3. GUID(全局唯一标识符)。
GUID与自动递增值及唯一名称比较
GUID
在客户端生成,由GUID的特性决定,通过GUID生成的值可能出现重复的机会几乎等于零,因此保证在插入表的时候主键值唯一。
可以方便处理分布式数据的提交,比如:分店数据向总店提交――直接将该部分数据插入即可。
支持离线数据处理。对本地数据包进行新增记录时即可将该数据表的关键字段值赋值,其处理方法是与在线新增时是一致的。
自动递增值
在数据库服务器端生成,由于该值是由数据库系统内部处理的,亦保证其唯一性,但由于其是在数据库服务器端生成,因此必须将该值返回客户端,客户端通过该值过行其它操作。比如一张单据(主从表)是使用自动递增值,当插入单据抬头后,必须将单据抬头的关键字段值返回,再插入单据明细(单据明细是通过单据抬头关键字段进行关联的)。
不能很好处理分布式数据的提交,比如:分店数据向总店提交――提交数据时必须重新生成该数据表的关键字段值,以保证该字段值唯一。
要支持离线数据处理需要进行额外的处理,对本地数据包进行保存记录(保存到本地)时需要插入一个假设唯一值,在提交离线数据回数据服务器时再重新生成真正的唯一值,并重新进行相关的处理。
唯一名称
在客户端生成或在服务端生成,相对于自动递增值不同的地方就是自己维护生成唯一值的算法及所保存的临时值,容易造成出错或其它问题。如果是在客户端生成唯一值的话,还必须保证所生成的值是唯一的。
不能很好处理分布式数据的提交,比如:分店数据向总店提交――提交数据时必须重新生成(或预先处理)该数据表的关键字段值,以保证该字段值唯一
要支持离线数据处理需要进行额外的处理,对本地数据包进行保存记录(保存到本地)时需要插入一个假设唯一值,在提交离线数据回数据服务器时再重新生成真正的唯一值,并重新进行相关的处理。
实例说明
下面以一个新增单据保存比较GUID与自动递增值/唯一名称的差别
| 
 动作  | 
 GUID  | 
 自动递增值/唯一名称  | 
| 
 单据抬头  | 
||
| 
 新增  | 
 单据抬头关键字段值:获取并填写  | 
 单据抬头关键字段值:无  | 
| 
 保存  | 
 直接保存  | 
 首先获取并填写关键字段值,然后再进行保存  | 
| 
 返回  | 
 直接返回  | 
 返回时必须将关键字段值返回  | 
| 
 单据明细  | 
||
| 
 新增  | 
 关联单据抬头字段值:直接填写 单据明细关键字段值:获取并填写  | 
 关联单据抬头字段值:无 单据明细关键字段值:无  | 
| 
 保存  | 
 直接保存  | 
 获取单据抬头关键字段值并填写到单据明细的关联单据抬头字段中; 然后获取并填写单据明细关键字段值; 再进行保存  | 
综合以上所述,用GUID作为数据表的关键字段值是可以减轻关键字段相关的操作的,并且是最直接实用的方法。
使用GUID作为数据表主键的好处(转)的更多相关文章
- 设置MySQL数据表主键
		
设置MySQL数据表主键: 使用“primary key”关键字创建主键数据列.被设置为主键列不允许出现重复的值,很多情况下与“auto_increment”递增数字相结合.如下SQL语句所示: My ...
 - SQLITE数据表主键设置Id自增方法
		
SQLITE数据表主键设置Id自增方法 标签: sqliteintegerinsertnulltableapi 2010-01-12 08:39 35135人阅读 评论(8) 收藏 举报 分类: S ...
 - django学习-13.通过pk值手动设置数据表主键
		
1.前言 通过django框架的Model层来新增数据库表时,如果在需要新增的表字段里任何一个表字段都没设置主键,框架会默认新增一个表字段id并把该表字段id设置为主键. 那么,如果我们想自己动手设置 ...
 - 从Redis生成数据表主键标识
		
对于MySql的全局ID(主键),我们一般采用自增整数列.程序生成GUID.单独的表作为ID生成器,这几种方案各有优劣,最终效率都不能说十分理想(尤其海量数据下),其实通过Redis的INCR可以很方 ...
 - MyBatis框架——mybatis插入数据返回主键(mysql、oracle)
		
向数据库中插入数据时,大多数情况都会使用自增列或者UUID做为主键.主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A.B中插入数据(A的主键是 ...
 - 如何准确高效的获取数据库新插入数据的主键id
		
例如我们新建了一张表UserInformation,字段如下Id,为主键,自增,其它字段Name,Pwd,Email 然后我们来执行一个新增插入操作: insert into UserInformat ...
 - 解决getJdbcTemplate往oracle数据库中插入数据返回主键出错问题
		
我们使用Spring中的JdbcDaoSupport往Mysql中插入数据并返回主键代码,我们使用的mysql数据库,主键在数据库中设置为自增长:该类继承自JdbcDaoSupport,所以能直接使用 ...
 - 一个7重嵌套表EF添加语句,注意子表赋值过程中只需写子表主键赋值,不需要写子表外键=父表主键。EF创建时会自动将子表外键设为与父表主键相等
		
AIRPORT_HELIPORT tt = new AIRPORT_HELIPORT() { AIRPORT_HELIPORT_UUID = Gui ...
 - Mybatis框架(9)---Mybatis自定义插件生成雪花ID做为表主键项目
		
Mybatis自定义插件生成雪花ID做为主键项目 先附上项目项目GitHub地址 spring-boot-mybatis-interceptor 有关Mybatis雪花ID主键插件前面写了两篇博客作为 ...
 
随机推荐
- Array,Vector,List,Deque的区别与联系【转+改】
			
数组 内存连续分配,长度大小固定,内置的最基础的数据结构之一.支持随机访问和随机存储. 该类型数据所占内存空间最小. Vector 是C++ STL中的一个容器.和数组类似,它拥有一段连续的内存空间, ...
 - 页面找不到js方法的原因,关于EasyUI
			
有时EasyUI中datagride写法不正确,会导致无法加载页面上其他的js方法.datagride中的逗号是一个也不能多.一定要注意: 例如以下代码中标红的逗号就会导致后边的js不能正常加载. c ...
 - CentOS6.5内核升级到linux 3.12.17教程
			
环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:Linux centos 2.6.32-431.el6.x86_64(Centos-6.5-x86_64-mi ...
 - LINPACK測试
			
1简单介绍 LINPACK是线性系统软件包(Linear system package) 的缩写. Linpack如今在国际上已经成为最流行的用于測试高性能计算机系统浮点性能的benchmark.通过 ...
 - (二)Redis 笔记——发布&订阅、事务、数据库操作
			
1. Redis 发布订阅 1.1 概述 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下 ...
 - sql分组最大值相关
			
房产表tf_estate_card,利润中心组profit_group_code,资产号main_assets_number,原值original_value 查出每个利润中心组的最大原值及其资产号 ...
 - 二维数组,锯齿数组和集合  C# 一维数组、二维数组(矩形数组)、交错数组(锯齿数组)的使用  C# 数组、多维数组(矩形数组)、锯齿数组(交叉数组)
			
二维数组,锯齿数组和集合 一.二维数组 二维数组:一维数组----豆角二维数组----表格 定义:1.一维数组:数据类型[] 数组变量名 = new 数据类型[数组长度];数据类型[] 数组变量名 = ...
 - HTTP协议--cookie、session、缓存与代理
			
1 Cookie和 Session Cookie和 Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决 HTTP无状态的问题而所做的努力. Session可以用 Cook ...
 - java正则表达式基础知识(转)
			
1基础 2.1 简单字符类 构造 描述 [abc] a,b或c [^abc] 除a,b或c外的字符 [a-zA-Z] a至z 或 A至Z [a-d[m-p]] a至d 或 m至p [a-z&& ...
 - Backup and Recovery Basics1
			
一.Backup and Recovery Overview 1.Backup and Recovery Overview 1.1 What is Backup and Recovery? 一般,备份 ...