首页 新闻 会员 周边 捐助

数据库ID设计问题

0
悬赏园豆:50 [已解决问题] 解决于 2019-05-29 18:13

数据库ID设计问题

公司sql server ID格式

user0001 (一个前缀+自增序号)

理由是

  • 能看出这个是什么ID,也就是通过这个ID就能知道这个是user的ID了,

但是感觉这样有很大缺陷

  • 字符串比较比int慢,存储空间还大
  • 生成一个id需要查找前面最大序号,多线程或者多客户端同时使用的情况下需要在sql上加事务或者锁。

其他方案:snowflake,sql server 2012有自增序列,guid

snowflake这个是应用到比较大型的业务上的,所以目前业务上还不需要这种算法,目前也不好升级到sql server2012,

想问一下大家的ID是使用什么方案的?
id真的需要携带其他信息吗?

公司没DBA,也没办法说服设计数据库的使用自增ID。想知道大家对ID设计的看法

海之殇的主页 海之殇 | 菜鸟二级 | 园豆:500
提问于:2019-05-29 16:19
< >
分享
最佳答案
0

我觉得有点舍本逐末。如果仅仅是为了方便查看,这么做不值得,太鸡肋,数据多了也浪费性能。GUID也不推荐,会造成存储碎片话。如果没有什么特殊需求,自增主键是最好的。Id不要带业务信息,它的作用就是唯一标志而已。

设计数据库的人一时脑抽了吧,就算是要看出id是哪个表的也可以根据列名来看,比如user表的id可以叫userid,为什么要从数据看出是那个表的,令人费解。

难道要把不同表的id放到一起?然后根据id前缀进行不同的操作?太狗血了

收获园豆:30
会长 | 专家六级 |园豆:12461 | 2019-05-29 16:28

会长大大能不能帮我看下我的那个socket的问题。。。

小光 | 园豆:1766 (小虾三级) | 2019-05-29 16:33

@小光: 好久没搞过了,年轻人的时候做作业搞过,好久了

会长 | 园豆:12461 (专家六级) | 2019-05-29 16:34

@会长: 嗯,我再看看

小光 | 园豆:1766 (小虾三级) | 2019-05-29 16:35

@小光:
看了你的问题了
一般服务端不会主动关闭socket连接
数据发送也不是一次全部发送过去的
比如说你分两次发送“123456”,“abcdef”,然后网络不好的时候,服务端可能分三次接收“123” “456ab” "cdef",所以你服务端一次outputstream不会获取完客户端两次发送过来的内容,可能只接收到了“123”。然后这时候你就把socket关闭了,客户端还正在发送“abcdef”,这时候当然会报错。

海之殇 | 园豆:500 (菜鸟二级) | 2019-05-29 16:47

还没这么狗血的程度,我自己是真恶心这种ID,只能想办法减少这类的ID了

海之殇 | 园豆:500 (菜鸟二级) | 2019-05-29 16:56

@海之殇: 我把close注释掉也一样,在没close的时候客户端第二次获取soket的流就获取不到了

Exception in thread "main" java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:903)

小光 | 园豆:1766 (小虾三级) | 2019-05-29 17:11

@小光:
关闭返回的 OutputStream 将关闭关联套接字
我是搞.net的,对socket原理还算懂点,所以知道不是socket问题,就猜是api问题,然后就查到这个。
你要玩socket建议你看一下TCP/IP详解

海之殇 | 园豆:500 (菜鸟二级) | 2019-05-29 17:28

@海之殇: 查到了,麻烦了

小光 | 园豆:1766 (小虾三级) | 2019-05-29 17:42

@海之殇: 来问题评论一下,我结不了贴。。。。,有豆子你也好问问题

小光 | 园豆:1766 (小虾三级) | 2019-05-29 17:53

@小光: 评论了,确实挺缺豆,哈哈

海之殇 | 园豆:500 (菜鸟二级) | 2019-05-29 18:05
其他回答(3)
0

没必要把,在什么表中id就是那个表的唯一标识,也就知道它是什么id
我们之前项目id是根据当前时间根据一定的计算算出来的,所以不会重复

收获园豆:5
小光 | 园豆:1766 (小虾三级) | 2019-05-29 16:27
0

id代表存储地址,为了统一简单没必要和业务id 模糊一起;当没业务id仍然需要存储id;因此直接所有上id。
这跟面向对象内部代码不一样,这层给你封装了 —— 叫引用。
但对外接口代码通行方式仍然这样,所以你能在各种场所看到handle。
所以无路怎么样,为找到该数据提供一个地址id。

收获园豆:10
花飘水流兮 | 园豆:13595 (专家六级) | 2019-05-29 16:58
0

小的我感觉没必要啊 非得根据id去看这个人么 不能去看别的字段?比如 username之类的 何必去看id。

收获园豆:5
^keepHungry$ | 园豆:516 (小虾三级) | 2019-05-29 17:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册