这个问题的 根源属于一个臆断吧
通常我们选取主键的时候,都是使用int类型并且设置为identifier
而有些人也提出使用guid作为主键的
那么我的问题是
使用guid的话,就无法判断 数据添加的先后顺序了,当然也就不能在查询中通过guid来排序了
那么如果选用guid作为主键,那么有什么办法来实现 上面提到的 无法判断 数据添加的先后顺序的问题呢?
我自己想到的是 添加一个 datetime列,来记录数据插入的时间(有些表表示的实体原本就有这个属性,有些实体则么有,前者使用现有的就好,后者则需要额外添加)
那么 使用datetime排序的话,是不是其性能 没有 标识列 的主键性能好呢?(应该如此吧,曾经看到过一个帖子,说是索引在处理数值类型的属性时比处理字符串或其他类型的属性 效率高一些)
那么大家有没有在项目中使用guid作为主键的呢?
有没有遇到上面的问题呢?
怎么解决的呢?
已经使用GUID做主键 N年的飘过。
表示不在BAT上班,没有性能方面的压力。
从来没有开发过上亿元的项目,没有性能的压力。
表示性能的压力90%以上是由Stupid Programmer 造成的。
大叔 我想死你了。。。。。
这个,性能的话,基本没有影响的(之前看到过一个帖子 测试过)
我更想弄清楚的是:
使用guid的话,如何标示 数据创建的先后顺序。
虽然我也有一些想法,但是我不知道我的想法入不入流啊(在某些情况下 我不想非主流)
另外,原谅我菜鸟了
【Stupid Programmer】这个是什么。。。。。
刚才搜了下,没找到什么东西啊。有资料的话给个链接啊
@算了: 愚蠢的程序员
@DepuCaptain: 愚蠢的人类
@算了: 干了,你不是问Stupid Programmer 是什么,就是这么个意思
@DepuCaptain: 额。。。。。那个,我还以为是什么 高精尖的 新技术呢。。。。哈哈哈
抱歉抱歉 不好意思
@DepuCaptain: 哎 英语不好 stupid 看成 stup id 了。。哎见笑见笑 太丢人了
@算了:
1、我所有的数据表都有时间标志。
2、使用GUID比较容易处理一对多结构的UI编程。
3、你要用INT自增也行,只要你不嫌他麻烦。用GUID也行,只要你不嫌麻烦。
表示一直使用自增int做主键。没有单表数据量超过30亿的,也没遇到需要分库同步的需求。
如果用guid性能还真不是问题,只是看着不友好,排序需要一个时间戳。
数据修改的话 时间戳跟着变。
这样的话,
排序后 新修改的数据 排在 最新插入数据的后面了
@算了: 他说的时间戳不是那个时间戳,就是一个表示时间的字段。
比如我有两个字段,一个是CreateTime,一个是UpdateTime。
本来也担心这样随便增加字段会不会给地球造成什么压力的,
后来发现数据量增大,硬盘重量没有跟着增大,就放心了。
@算了: 大叔说得对,这个时间戳不一定是修改时间。可以是一个特定的排序时间戳,比如(OrderDate 字段)
@爱编程的大叔:
珍爱地球,我们只有一个地球
大叔好有环保意识
------------------
还真是。我理解成timestamp了
那就跟我自己的想法一样了,就是给表加个属性记录数据创建的时间。嗯嗯
跟我想到一块去了,英雄所见略同啊
@幻天芒:
嗯 嗯 大叔说的对
我理解错了,以为说的timestamp 嘿嘿
个人觉得看你对项目的了解程度进行定义这个主键,如果是真正的面向对象的开发的话,是不建议有数据库插入时候生成主键的,而是之前就确定可以唯一标识当前对象的值对象,而且主键也是有明确含义的,向GUID这些没有意义的而且占用资源的有时候还是可以不用的,例如如果你的主键是 acbc_2014-5-6_xxxx_QRSZX,你可以看出他是爱存不存银行在2014/5/6那天对于xxxx操作QRSZX可以是你们的防止重复的约定,就比较有意义了。如果按你的方式的话额外定义个排序字段。
感谢您的回复,本来计划关闭这个问题的。(这两天有点忙,忘记了)
然后看到您的回复
我有一些问题不明
1:貌似实际项目中通常都是使用伪主键吧,就是没有实际意义的属性作为键
2:【如果是真正的面向对象的开发的话,是不建议有数据库插入时候生成主键的,而是之前就确定可以唯一标识当前对象的值对象】这句话我理解的不是很明白
3:【acbc_2014-5-6_xxxx_QRSZX】这种主键定义的方式,不也同样是占用资源的定义方式么?
且貌似这种定义方式,违反了第一范式 原子性吧?感觉太多的属性值组合在一起了。
4:关于最后一点,添加额外属性决绝排序问题,前面两位大大的解答也是同样的解决方式,这个是认同的
感谢关注,非常感谢
@算了: 哪有那么多原子性,领域对象也需要唯一标识,你说的那个就是数据驱动开发了,谈不上面向对象开发
@Halower: 不赞同你的观点,你说的情况适合业务主键,而不是数据库主键。针对记录的主键,个人觉得有业务无关性是比较好的设计。
@幻天芒: 领域驱动本来就为业务而生,领域的任何对象原则上都应该是有意义的,但是如果是标识是有数据库后生产的,当然会出现这种情况,但是有个风险就是如果没有提前指定唯一标识【这里看个人喜好了,你非要没意义那就没意义】,同时标识也是值对象当然可以提取一些有效信息,就会出现事件发布到外界上下文可能多次分发,也无法跟踪,所以建议数据库前提早生产,此外对于简单的CRUD当然没意义也是浪费时间
@Halower: 如果是按照DDD的开发思路,你这个是可行的。不过需要更复杂的处理逻辑,如果是一般的项目,反而增加复杂度。
同时领域主键和数据库主键并不冲突。int自增还能起到一个索引的效果。
@算了: 妹的,我把你往沟里引,都不给点辛苦豆,比我还坑
@Halower: 你们俩PK ,怪我咯。。。
嘿嘿
,主要是在你回答的时候这个问题已经有结果了,我只是忘了关
而且,你第一次回复我的时候,我并不是很认同你的答案啊。。。。
在这说了。什么分不分的。。你看我有多少分
引用 大叔的话说, 我要分干嘛,能当饭吃么?
还有 幻天芒 大大,回答完问题之后,都没有再呼叫他,人家还来看看呢。
其实这个帖子我确认的也很纠结
楼上两位 经常回复我的问题,且每次都是耐心的不得了
但是,一个帖子只能 确认一个人。我也很无奈。当然了,人家也不在乎这点分了。。。。
(记得 上次幻大大 的回答我就没采纳 ,不时有些小内疚的说,,吼吼吼吼吼)
然后把,
你俩接着PK哈,挺精彩的,呵呵
@幻天芒:
@算了: 哈哈,错了,我和他是现实中的朋友
@Halower:
汗。。。。。。。。。。。。。。。
原来如此。不小心被你们晃了。
人与人之间最基本的信任都哪里去了
@算了: 要分是我和你开玩笑的
@Halower:
嗯 ,大概了解。
我估摸你是 处于下风 拿我找突破口呢
@Halower:
正好 问问你啊,
DDD好学么? 我买了本书,之前看了几页,感觉有点抓不住 要点,云里雾里的,不过也估计是当时没心气看吧
一直都没接着看,但是又很想看,不过又没多少时间看,。。。。。好纠结
@算了: 你那里的突破口?我从来都是顺风,不进也不退
@算了: DDD其实也是一种思想,但是门槛也很高,基础要非常扎实,否则又是一雾水
@算了: 自然DDD,慢慢就有感觉了
@Halower:
门槛高? 那么它的门槛 是由什么组成的?