主要观点:一些应用如待办事项列表需维护用户定义的项顺序,挑战在于顺序任意且用户重排时会改变。文章探讨在 SQL 中建模该情况的最佳方式,评估三种属性(空间时间效率、稳健性、优雅性),并提出四种方法。
关键信息:
- 方法 1:整数位置列,添加自增整数列跟踪项位置,插入或重排困难,需延迟唯一性约束,平均效率低,较稳健但不优雅。
- 方法 2:十进制位置,用
float
或numeric
存储行位置,插入容易但浮点精度有限,numeric
精度可变但随列表重排空间消耗大,效率较高、不稳健但优雅。 - 方法 3:真分数,使用
pg_rational
扩展进行精确分数运算,以 64 位存储分数,稳健且优雅,效率高。 - 方法 4:真分数作为浮点数,计算用有理类型但存储为浮点数,比较快但分数转换有开销,貌似稳健但不如单独处理分数直接。
重要细节: float
很快耗尽精度,numeric
随整数部分增长需更多字节,pg_rational
形成二叉树可精确计算分数。- 插入新项技巧,如插入在某两项之间、在列表末尾插入等。
- 可添加
btree
索引到位置列,隐藏分数编号可通过row_number()
函数。
结论:推荐使用pg_rational
的真分数来存储列表顺序,给出使用该扩展的一些技巧,如插入项的方法、添加索引等,并提到可订阅 Begriffs 通讯。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。