UUID做主键,好还是不好?这是个问题
2018-04-11 15:48
323 查看
我唯一还算熟悉的数据库就算是MySQL了,大概使用MySQL的人,百分之九九以上的人会使用Autoincrement ID做主键,这是可以理解的,因为MySQL的自增ID效率很高,使用也很方便。那么剩下的百分之一的人使用什么做主键呢?可能是自己做的KeyGenerator,也可能是我们下面要说的UUID。
据说在Oracle的圈子里,如果谁用自增ID做主键是要被鄙视的,主键最自然的选择就是UUID。我不了解Oracle,这些道听途说的结论是否正确不做承诺。
那么我们先看看什么是UUID?简单的说,UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。在UUID的算法中,可能会用到诸如网卡MAC地址,IP,主机名,进程ID等信息以保证其独立性。
如果你的MySQL版本不太老的话,键入 SELECT UUID(); 输出的就是UUID,如下:
mysql> select uuid();
+--------------------------------------+
| uuid() |
+--------------------------------------+
| 54b4c01f-dce0-102a-a4e0-462c07a00c5e |
+--------------------------------------+
oracle> select sys_guid() from dual ;
SQLSERVER中的
类似于java的 System.out.println(UUID.randomUUID().toString()); // 079d2a0e-f310-40c6-8389-a160821ff737
现在大家应该对UUID有一个比较直观的认识了,我们来看看UUID的优缺点分别是什么。
优点:
能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。
在oracle做数据迁移的时候不会因为表的sequence不连续而出现问题
缺点:
比较占地方,和INT类型相比,存储一个UUID要花费更多的空间。
使用UUID后,URL显得冗长,不够友好。
下面针对上述UUID的缺点说说我的看法,比较占地方这个缺点我不是很在乎,现在最不值钱的就是硬盘了,略过此条缺点无妨,但需要注意的一点数据在索引的时候效率会随着体积的增加而降低。至于说使用UUID后,URL显得不友好,我觉得这多少是你的INT情结造成的惯性思维,其实,和INT类型相比,UUID才是最自然的主键选择,注意,我这里用的是自然这个形容词,仔细体会一下你能理解我的意思。另外,很多时候,URL本身就不需要友好,比如,一个电子商务网站,按照INT友好的URL说法,她的订单URL大概是下面这个形式的:/order.php/id/123,我要说明的是,这样是很友好,但是有些太友好了,友好的甚至不安全,比如说,我早晨下一个订单,发现URL是/order.php/id/1000,晚上再下一个订单发现URL是/order.php/id/2000,那么我就可以估计出此网站一天的订单数大致是1000左右,甚至能大体估计出它的销售额,而这些数据往往都是重要的商业秘密。使用UUID就没有这个顾虑。
java获得uuidimport java.util.UUID;public class IdGenerate { public static String getUUIDString() {
String id = UUID.randomUUID().toString();
id = id.replace("-", "");
return id;
}public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(IdGenerate.getUUIDString());
}}
转载:http://blog.chinaunix.net/uid-20624711-id-3017537.html
据说在Oracle的圈子里,如果谁用自增ID做主键是要被鄙视的,主键最自然的选择就是UUID。我不了解Oracle,这些道听途说的结论是否正确不做承诺。
那么我们先看看什么是UUID?简单的说,UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。在UUID的算法中,可能会用到诸如网卡MAC地址,IP,主机名,进程ID等信息以保证其独立性。
如果你的MySQL版本不太老的话,键入 SELECT UUID(); 输出的就是UUID,如下:
mysql> select uuid();
+--------------------------------------+
| uuid() |
+--------------------------------------+
| 54b4c01f-dce0-102a-a4e0-462c07a00c5e |
+--------------------------------------+
oracle> select sys_guid() from dual ;
SQLSERVER中的
类似于java的 System.out.println(UUID.randomUUID().toString()); // 079d2a0e-f310-40c6-8389-a160821ff737
现在大家应该对UUID有一个比较直观的认识了,我们来看看UUID的优缺点分别是什么。
优点:
能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。
在oracle做数据迁移的时候不会因为表的sequence不连续而出现问题
缺点:
比较占地方,和INT类型相比,存储一个UUID要花费更多的空间。
使用UUID后,URL显得冗长,不够友好。
下面针对上述UUID的缺点说说我的看法,比较占地方这个缺点我不是很在乎,现在最不值钱的就是硬盘了,略过此条缺点无妨,但需要注意的一点数据在索引的时候效率会随着体积的增加而降低。至于说使用UUID后,URL显得不友好,我觉得这多少是你的INT情结造成的惯性思维,其实,和INT类型相比,UUID才是最自然的主键选择,注意,我这里用的是自然这个形容词,仔细体会一下你能理解我的意思。另外,很多时候,URL本身就不需要友好,比如,一个电子商务网站,按照INT友好的URL说法,她的订单URL大概是下面这个形式的:/order.php/id/123,我要说明的是,这样是很友好,但是有些太友好了,友好的甚至不安全,比如说,我早晨下一个订单,发现URL是/order.php/id/1000,晚上再下一个订单发现URL是/order.php/id/2000,那么我就可以估计出此网站一天的订单数大致是1000左右,甚至能大体估计出它的销售额,而这些数据往往都是重要的商业秘密。使用UUID就没有这个顾虑。
java获得uuidimport java.util.UUID;public class IdGenerate { public static String getUUIDString() {
String id = UUID.randomUUID().toString();
id = id.replace("-", "");
return id;
}public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(IdGenerate.getUUIDString());
}}
转载:http://blog.chinaunix.net/uid-20624711-id-3017537.html
相关文章推荐
- UUID做主键,好还是不好?这是个问题
- 【转载】UUID做主键,好还是不好?这是个问题。
- UUID做主键,好还是不好?这是个问题。
- UUID做主键,好还是不好?这是个问题。
- UUID做主键,好还是不好?这是个问题。
- UUID做主键,好还是不好?这是个问题。
- UUID做主键,好还是不好?这是个问题
- MySQL数据库UUID()函数引起主键冲突问题
- JPA Hibernate 使用UUID做为主键的问题
- hibernate 中Entity主键采用UUID时save不保存问题
- Builder模式解决构造函数多参数阅读性不好问题
- 有关sql server用int型主键的一些问题
- android 闪屏还是会出现黑屏问题
- 其实还是实力问题
- mysql安装过程的问题-java这条路真的不好搞呀,连个配置都要这么长时间
- 不好的事情,终于还是发生了
- 关于LD_LIBRARY_PATH的问题; 为什么说LD_LIBRARY_PATH不好
- Mybaties插入生成UUID并返回主键
- Vector还是ArrayList这是个问题
- HDU 2553 N皇后问题(还是DFS呀)