【发布时间】:2010-12-13 19:47:54
【问题描述】:
我想用我自己定制的 id 生成器替换我在我的 postgresql 数据库中用于 id 的一些序列。生成器将产生一个随机数,最后带有一个校验位。所以这个:
SELECT nextval('customers')
会被这样的东西取代:
SELECT get_new_rand_id('customer')
然后该函数将返回一个数值,例如:[1-9][0-9]{9},其中最后一位数字是校验和。
我的担忧是:
- 如何使事物原子化
- 如何避免两次返回相同的 id(尝试将其插入具有唯一约束的列中会被捕获,但我认为为时已晚)
- 这是个好主意吗?
注意1:我不想使用uuid,因为它是用来和客户沟通的,10位数字比36位uuid简单得多。
注意2:该函数很少使用SELECT get_new_rand_id() 调用,但会在id 列上分配为默认值,而不是nextval()。
编辑:好的,下面的讨论很好!以下是对为什么的一些解释:
-
那么,我为什么要以这种方式过度复杂化事情呢?目的是对客户隐藏主键。
我给每个新客户一个独一无二的 customerId(生成的序列号在 分贝)。既然我这么沟通 与客户的号码是 对我的竞争对手来说相当简单的任务 监控我的业务(有 其他编号,例如发票编号和 订购具有相同的 nr 特性)。就是这个监控我 想做一点 更难(注意:并非不可能,但 更难)。
-
为什么是校验位?
在谈论隐藏序列号之前,我在 ordernr 中添加了一个校验位,因为在制作过程中的某些时候手指很笨拙,我的想法是,这将是一个很好的做法,以供将来保留。
阅读讨论后,我当然可以看到我的方法不是解决我的问题的最佳方法,但我对如何解决它没有其他好主意,所以请在这里帮助我。
- 我是否应该添加一个额外的列来放置我向客户公开的 id 并将序列号作为主键?
- 如何生成要以合理有效的方式公开的 ID?
- 校验位是否必要?
【问题讨论】:
-
我不是在批评,只是想理解。为什么要在代理主键中添加校验位?为什么要与客户共享该主键?
-
你为什么要这样做呢?它给你带来了什么?
标签: sql postgresql random