- 主题:double类型可以用来做形式主键吗?
最近一个小项目里面,因为某种不足评论的原因,在考虑用double做表的形式主键。是业务系统内部生成的唯一递增的值。
虽然是觉得荒谬。但还是想认真请教一下,这么做有没有大的弊端?是否可行?
--
修改:misslost FROM 120.245.130.*
FROM 120.245.130.*
关于数学运算。我感觉主键主要是比较关系运算,不需要对主键进行数学运算。所以好像没什么影响?
因为主键的值是很规范的很普通的浮点值,也不会有NaN等问题?
占用空间确实是8字节。其实本来是希望用int64 但是因为某种奇怪的外部原因 不能选择这个类型。(其实这个奇怪原因也可以解释一下,是无关话题。因为用到protobuf定义数据结构和json规范。而protobuf认为json的局限性导致没有int64的完善支持,所以会把int64转换为字符串存储。这在很多地方就难受了,存储和比较,排序都会有问题。所以考虑用double规避这个问题。)
【 在 a0123456789q 的大作中提到: 】
: 可以的。但逻辑确实很奇怪,不是很建议,因为:
: double的运算因为精度问题和我们的预测不一定一致;
: double里有很多NaN表示异常,无法排序;
: ...................
--
修改:misslost FROM 120.245.130.*
FROM 120.245.130.*
但是,补0之后,类型还是字符串。这样比较主键,或者排序,难道不比double类型更慢吗?
【 在 roy 的大作中提到: 】
: 转成string时在前面补0,不会影响比较
:
--
FROM 120.245.130.*
这里我强调的是 形式主键,不是业务主键。所以,一般不存在数学运算的情况。
【 在 roy 的大作中提到: 】
: 1. double比较肯定比int要慢的多
: 2. 如何保证查询时生成的double键值和主键里存的值完全一致?
: 最简单的,0.1+0.1+0.1不等于0.3
: ...................
--
FROM 120.245.130.*
确是如此的。默认就是将int64转成字符串,而且也没有选项可以调节的。如果要改似乎只能改源码,而且改了之后因为不符合规范,是无法跟外部系统对接的。其实仔细考虑,我能够理解protobuf的这种设计理念。
我觉得这个锅应该是json来背。多少年了,落后了毫无升级。
【 在 ble 的大作中提到: 】
: pb转json的int64默认是字符串吗?难道不应该用户主动设置才会转字符串?
: 发自「今日水木 on 钛星」
--
FROM 120.245.130.*
这样的where字句肯定很多。
我用到的主键值都是整型转的,就是1.0 2.0之类的 小数位都是零。
是否存在你说的这种奇怪的转换问题,还真不知道呢。
【 在 vmx 的大作中提到: 】
: 你这里会写这种格式么? where pk_col = 124.55;
: 怎么保证外面调用的时候压进来的参数(如果是用double压)不会变成124.54999999
: 如果是用string压进来的,我觉得你这直接存varchar2好像也差不多
--
FROM 120.245.130.*