|
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个可以输入的来源,再后面是时间戳到秒。在前面信息都满足的情况下,同一秒只能有一个人,一辆车经过一个点位。所以整个系统的数据是唯一的。然后省级联网以后也是唯一的。
只要一看主键就大致知道了那个城市,区,街道,点位,车道(断面),什么时间点产生的数据。
|
|