楼主: Naldonado

[讨论] 【大话IT】ORACLE的PK之间的PK(sequence vs guid)

[复制链接]
论坛徽章:
57
ITPUB15周年纪念
日期:2016-10-13 13:15:342017金鸡报晓
日期:2017-01-10 15:39:052017金鸡报晓
日期:2017-02-08 14:09:13秀才
日期:2017-02-22 15:14:12秀才
日期:2017-02-22 15:16:26秀才
日期:2017-02-22 15:18:00秀才
日期:2017-05-09 11:37:55秀才
日期:2017-07-11 14:19:35ITPUB18周年纪念章
日期:2018-11-13 15:31:24
31#
发表于 2017-4-28 13:28 | 只看该作者
主要考虑 生产场景,结合实际,没有好坏之分,适合自己的,就是最好的。 当前数据库类型比较多,如果考虑未来扩展需求,可以适当的选择一款数据库,用它本身自有的特性,来生成主键最好。

使用道具 举报

回复
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:42:02秀才
日期:2015-12-18 09:28:57秀才
日期:2015-12-14 14:51:162015年中国系统架构师大会纪念徽章
日期:2015-09-16 12:54:392014系统架构师大会纪念章
日期:2015-09-16 12:54:392013系统架构师大会纪念章
日期:2015-09-16 12:54:392012系统架构师大会纪念章
日期:2015-09-16 12:54:392011系统架构师大会纪念章
日期:2015-09-16 12:54:392010系统架构师大会纪念
日期:2015-09-16 12:54:39秀才
日期:2015-12-25 15:31:10
32#
发表于 2017-5-4 14:36 | 只看该作者
1.目前大家在工作中运用的是何种方式生成的主键,原因是什么?
答:这个分几个层面来说。
一首先是开发定义。
1、一部分开发喜欢定义主键叫ID,就是从1开始。尤其是MySQL的时候。无论Oracle和MySQL定义ID从1开始的,仅仅是为了主键而主键。觉得没主键不行,有一个别人问起来就说有。但是where条件和这个ID一点关系都没有。完成是摆设。
2、采用GUID来生成,这种比起上面有见地,这个GUID的主键他们是会用的。
3、彻底没有主键,完全不知道他的重要性。
二是DBA层面定义的。
1、根据业务需要定义主键,一定是有意义的主键。在用户表中,身份证号码就是主键。
2、字符串+序列生成和业务结合的自增序列作为主键。比如交易流水号,或者订单号作为主键。


2.针对上面提到的几种方式,各有什么好处或者劣势。
答:
首先没有主键的话,容易产生重复数据,对业务来说很不好,如果要清理重复数据是一项比较麻烦的工作。如果重复的数据上亿,那么时间非常长。所以如果遇到开发没有定义主键的话,基本上都是劣势。唯一一个优势就是客观上的确比有主键插入能快一点点。
其次摆设式的主键,没有任何优势,没人去用他查询,而且还可能产生重复数据,就连上面客观上比没有主键插入快的优势也没有了。和没主键没什么区别。
再次GUID来说,它是独一无二的。适合大量数据中的插入和更新操作。如果说劣势,只能说这个主键在聚簇因子上会比序列来的差。
后面谈谈DBA定义的主键,因为结合业务和数据库的知识来设计和建立的。基本来说没有劣势。

3.特殊情况下的主键生成(自定义方式),这是一种怎样特殊的场景,都是怎么实现的。
答:我们以前一个表要上百亿,每秒都要上千的insert。这种主键就非常重要,要精确定位一条数据全靠主键。场景是一个省或者城市的监控点每秒记录的人 车的经过信息。
我们的主键是 前六位是行政区划就像邮编和身份证前6位一样。优点是国家已经定义好了,而且不会随便改变。成熟的。那么如果不同城市的数据如果联网也没有问题,都可以区分的。
然后4位是监控点的位置,一个城市可以建立9999个监控点。目前就是北京上海这样的城市,在一个系统中的设备也没这么多。即使有,加1位就行。  再后面是车道号码或者人行道号码。一个设备可以覆盖99个可以输入的来源,再后面是时间戳到秒。在前面信息都满足的情况下,同一秒只能有一个人,一辆车经过一个点位。所以整个系统的数据是唯一的。然后省级联网以后也是唯一的。
只要一看主键就大致知道了那个城市,区,街道,点位,车道(断面),什么时间点产生的数据。

使用道具 举报

回复
论坛徽章:
187
状元
日期:2016-04-28 14:18:17榜眼
日期:2016-04-28 14:18:17探花
日期:2016-04-28 14:18:17进士
日期:2016-04-28 14:18:17举人
日期:2016-04-28 14:18:17红宝石
日期:2012-04-13 17:18:06蓝锆石
日期:2012-02-20 12:20:11紫水晶
日期:2012-04-19 12:49:17祖母绿
日期:2012-02-27 22:10:14海蓝宝石
日期:2012-02-27 16:58:24
33#
发表于 2017-5-5 10:42 | 只看该作者
1.目前大家在工作中运用的是何种方式生成的主键,原因是什么?
  一般是采用传统的序列(sequence)来创建主键,比较简单、易于操作。
  
2.针对上面提到的几种方式,各有什么好处或者劣势。
SYS_GUID,效率比较高,但一定要使用的场合不多,长度过长,不好分析。
传统的序列,简单易懂,但在特殊场合下可能不能满足要求。

3.特殊情况下的主键生成(自定义方式),这是一种怎样特殊的场景,都是怎么实现的。
比如,我们需要主键带上日期信息(年月日),我们可能会自定义一个函数,生成的主键为年月日+序列

使用道具 举报

回复
论坛徽章:
0
34#
发表于 2017-5-5 15:03 | 只看该作者
因为我不是纯oracle选手,虽然oracle的sequence非常优秀,但是依然有一些问题不能解决
比如移植数据库后的适应问题,移植到mysql,自己写个类似sequence的东西,但是实际可能会因为高并发出问题(应该没有彻底解决方案);
框架中, 如果主键类型不一致,可能导致框架写起来费劲。
不加主键的方式或者用业务主键代替的方式,都可以,但是不通用。

因此我的习惯是 :

1、 统一所有主键,不使用组合主键;

2、 绝大多数用GUID(UUID)而且我用36位char(因为java、php、C#等默认生成的都是36位的);

3、 如果不涉及到数据移植和数据同步的,我也可能选择用自增主键(oracle自然是sequence);

4、 如果仅提供数据服务,不需要服务层写代码,我可以接受不用主键或者用业务主键(比如身份证号主键);

刚刚发错位置了,只好粘过来

使用道具 举报

回复
论坛徽章:
12
秀才
日期:2016-05-20 15:09:32秀才
日期:2017-07-11 13:54:02秀才
日期:2017-06-29 10:06:08秀才
日期:2017-06-29 10:05:55秀才
日期:2017-06-29 10:05:55秀才
日期:2017-05-17 11:39:09弗兰奇
日期:2017-05-13 09:39:40技术图书徽章
日期:2016-05-20 15:09:52秀才
日期:2016-05-20 15:09:43秀才
日期:2016-05-20 15:09:43
35#
发表于 2017-5-7 10:36 | 只看该作者
1.目前大家在工作中运用的是何种方式生成的主键,原因是什么?
  目前都是用sequence,简单易用
  
2.针对上面提到的几种方式,各有什么好处或者劣势。
目前还没碰到过必须使用guid的场景,不好评论,但是guid方式效率、易用性肯定比sequence 差点

3.特殊情况下的主键生成(自定义方式),这是一种怎样特殊的场景,都是怎么实现的。
   碰到过一种情况, 也是为了分类, 由业务人员指定头几个字符,再加上序列, 比如gx+sequence, gx就代表广西用户。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表