首页 新闻 会员 周边 捐助

数据库表 关于主键 类型的选择

0
悬赏园豆:5 [已解决问题] 解决于 2014-12-04 22:19

这个问题的 根源属于一个臆断吧

通常我们选取主键的时候,都是使用int类型并且设置为identifier

而有些人也提出使用guid作为主键的

那么我的问题是

使用guid的话,就无法判断 数据添加的先后顺序了,当然也就不能在查询中通过guid来排序了

 

那么如果选用guid作为主键,那么有什么办法来实现 上面提到的 无法判断 数据添加的先后顺序的问题呢?

我自己想到的是 添加一个 datetime列,来记录数据插入的时间(有些表表示的实体原本就有这个属性,有些实体则么有,前者使用现有的就好,后者则需要额外添加)

那么 使用datetime排序的话,是不是其性能 没有 标识列 的主键性能好呢?(应该如此吧,曾经看到过一个帖子,说是索引在处理数值类型的属性时比处理字符串或其他类型的属性 效率高一些)

 

那么大家有没有在项目中使用guid作为主键的呢?

有没有遇到上面的问题呢?

怎么解决的呢?

算了的主页 算了 | 初学一级 | 园豆:3
提问于:2014-12-02 12:54
< >
分享
最佳答案
0

已经使用GUID做主键 N年的飘过。

表示不在BAT上班,没有性能方面的压力。

从来没有开发过上亿元的项目,没有性能的压力。

表示性能的压力90%以上是由Stupid Programmer 造成的。

收获园豆:3
爱编程的大叔 | 高人七级 |园豆:30844 | 2014-12-02 12:57

大叔 我想死你了。。。。。

这个,性能的话,基本没有影响的(之前看到过一个帖子 测试过)

我更想弄清楚的是:

  使用guid的话,如何标示 数据创建的先后顺序。

  虽然我也有一些想法,但是我不知道我的想法入不入流啊(在某些情况下 我不想非主流)

 

算了 | 园豆:3 (初学一级) | 2014-12-02 13:17

另外,原谅我菜鸟了

【Stupid Programmer】这个是什么。。。。。

刚才搜了下,没找到什么东西啊。有资料的话给个链接啊

算了 | 园豆:3 (初学一级) | 2014-12-02 13:19

@算了: 愚蠢的程序员

KingMi | 园豆:1344 (小虾三级) | 2014-12-02 13:31

@DepuCaptain: 愚蠢的人类

算了 | 园豆:3 (初学一级) | 2014-12-02 13:47

@算了: 干了,你不是问Stupid Programmer 是什么,就是这么个意思

KingMi | 园豆:1344 (小虾三级) | 2014-12-02 14:04

@DepuCaptain: 额。。。。。那个,我还以为是什么 高精尖的  新技术呢。。。。哈哈哈

抱歉抱歉 不好意思

算了 | 园豆:3 (初学一级) | 2014-12-02 14:07

@DepuCaptain: 哎 英语不好 stupid  看成 stup id 了。。哎见笑见笑  太丢人了

算了 | 园豆:3 (初学一级) | 2014-12-02 14:10

@算了:

1、我所有的数据表都有时间标志。

2、使用GUID比较容易处理一对多结构的UI编程。

3、你要用INT自增也行,只要你不嫌他麻烦。用GUID也行,只要你不嫌麻烦。

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-02 14:13
其他回答(2)
0

表示一直使用自增int做主键。没有单表数据量超过30亿的,也没遇到需要分库同步的需求。

如果用guid性能还真不是问题,只是看着不友好,排序需要一个时间戳。

收获园豆:2
幻天芒 | 园豆:37207 (高人七级) | 2014-12-02 14:00

数据修改的话 时间戳跟着变。

这样的话,

排序后  新修改的数据 排在 最新插入数据的后面了

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-12-02 14:11

@算了: 他说的时间戳不是那个时间戳,就是一个表示时间的字段。

比如我有两个字段,一个是CreateTime,一个是UpdateTime。

本来也担心这样随便增加字段会不会给地球造成什么压力的,

后来发现数据量增大,硬盘重量没有跟着增大,就放心了。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-02 14:17

@算了: 大叔说得对,这个时间戳不一定是修改时间。可以是一个特定的排序时间戳,比如(OrderDate 字段)

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2014-12-02 14:49

@爱编程的大叔: 

珍爱地球,我们只有一个地球

大叔好有环保意识

------------------

还真是。我理解成timestamp了

那就跟我自己的想法一样了,就是给表加个属性记录数据创建的时间。嗯嗯

跟我想到一块去了,英雄所见略同啊 

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-12-02 16:03

@幻天芒: 

嗯 嗯 大叔说的对

我理解错了,以为说的timestamp  嘿嘿

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-12-02 16:04
0

个人觉得看你对项目的了解程度进行定义这个主键,如果是真正的面向对象的开发的话,是不建议有数据库插入时候生成主键的,而是之前就确定可以唯一标识当前对象的值对象,而且主键也是有明确含义的,向GUID这些没有意义的而且占用资源的有时候还是可以不用的,例如如果你的主键是 acbc_2014-5-6_xxxx_QRSZX,你可以看出他是爱存不存银行在2014/5/6那天对于xxxx操作QRSZX可以是你们的防止重复的约定,就比较有意义了。如果按你的方式的话额外定义个排序字段。 

Halower | 园豆:1723 (小虾三级) | 2014-12-02 17:30

感谢您的回复,本来计划关闭这个问题的。(这两天有点忙,忘记了)

然后看到您的回复

我有一些问题不明

1:貌似实际项目中通常都是使用伪主键吧,就是没有实际意义的属性作为键

2:【如果是真正的面向对象的开发的话,是不建议有数据库插入时候生成主键的,而是之前就确定可以唯一标识当前对象的值对象】这句话我理解的不是很明白

3:【acbc_2014-5-6_xxxx_QRSZX】这种主键定义的方式,不也同样是占用资源的定义方式么?

且貌似这种定义方式,违反了第一范式 原子性吧?感觉太多的属性值组合在一起了。

4:关于最后一点,添加额外属性决绝排序问题,前面两位大大的解答也是同样的解决方式,这个是认同的

 

感谢关注,非常感谢

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-12-04 22:17

@算了: 哪有那么多原子性,领域对象也需要唯一标识,你说的那个就是数据驱动开发了,谈不上面向对象开发

支持(0) 反对(0) Halower | 园豆:1723 (小虾三级) | 2014-12-05 00:43

@Halower: 不赞同你的观点,你说的情况适合业务主键,而不是数据库主键。针对记录的主键,个人觉得有业务无关性是比较好的设计。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2014-12-05 08:44

@幻天芒: 领域驱动本来就为业务而生,领域的任何对象原则上都应该是有意义的,但是如果是标识是有数据库后生产的,当然会出现这种情况,但是有个风险就是如果没有提前指定唯一标识【这里看个人喜好了,你非要没意义那就没意义】,同时标识也是值对象当然可以提取一些有效信息,就会出现事件发布到外界上下文可能多次分发,也无法跟踪,所以建议数据库前提早生产,此外对于简单的CRUD当然没意义也是浪费时间 

支持(0) 反对(0) Halower | 园豆:1723 (小虾三级) | 2014-12-05 10:02

@Halower: 如果是按照DDD的开发思路,你这个是可行的。不过需要更复杂的处理逻辑,如果是一般的项目,反而增加复杂度。

同时领域主键和数据库主键并不冲突。int自增还能起到一个索引的效果。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2014-12-05 10:04

@算了: 妹的,我把你往沟里引,都不给点辛苦豆,比我还坑

支持(0) 反对(0) Halower | 园豆:1723 (小虾三级) | 2014-12-05 10:05

@Halower: 你们俩PK ,怪我咯。。。

嘿嘿

,主要是在你回答的时候这个问题已经有结果了,我只是忘了关

而且,你第一次回复我的时候,我并不是很认同你的答案啊。。。。

在这说了。什么分不分的。。你看我有多少分

引用 大叔的话说, 我要分干嘛,能当饭吃么?

还有 幻天芒 大大,回答完问题之后,都没有再呼叫他,人家还来看看呢。

其实这个帖子我确认的也很纠结

楼上两位 经常回复我的问题,且每次都是耐心的不得了

但是,一个帖子只能 确认一个人。我也很无奈。当然了,人家也不在乎这点分了。。。。

(记得 上次幻大大 的回答我就没采纳 ,不时有些小内疚的说,,吼吼吼吼吼)

然后把,

你俩接着PK哈,挺精彩的,呵呵

 

@幻天芒:

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-12-05 17:30

@算了: 哈哈,错了,我和他是现实中的朋友

支持(0) 反对(0) Halower | 园豆:1723 (小虾三级) | 2014-12-05 22:04

@Halower: 

汗。。。。。。。。。。。。。。。

 

原来如此。不小心被你们晃了。

 

人与人之间最基本的信任都哪里去了

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-12-05 22:13

@算了: 要分是我和你开玩笑的

支持(0) 反对(0) Halower | 园豆:1723 (小虾三级) | 2014-12-05 22:15

@Halower: 

嗯 ,大概了解。

我估摸你是 处于下风 拿我找突破口呢

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-12-05 22:19

@Halower: 

正好 问问你啊,

DDD好学么? 我买了本书,之前看了几页,感觉有点抓不住 要点,云里雾里的,不过也估计是当时没心气看吧

一直都没接着看,但是又很想看,不过又没多少时间看,。。。。。好纠结

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-12-05 22:22

@算了: 你那里的突破口?我从来都是顺风,不进也不退

支持(0) 反对(0) Halower | 园豆:1723 (小虾三级) | 2014-12-05 22:23

@算了: DDD其实也是一种思想,但是门槛也很高,基础要非常扎实,否则又是一雾水

支持(0) 反对(0) Halower | 园豆:1723 (小虾三级) | 2014-12-05 22:24

@算了: 自然DDD,慢慢就有感觉了

支持(0) 反对(0) Halower | 园豆:1723 (小虾三级) | 2014-12-05 22:26

@Halower: 

门槛高? 那么它的门槛 是由什么组成的?

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-12-05 23:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册