SQL 中的用户定义顺序

主要观点:一些应用如待办事项列表需维护用户定义的项顺序,挑战在于顺序任意且用户重排时会改变。文章探讨在 SQL 中建模该情况的最佳方式,评估三种属性(空间时间效率、稳健性、优雅性),并提出四种方法。
关键信息:

  • 方法 1:整数位置列,添加自增整数列跟踪项位置,插入或重排困难,需延迟唯一性约束,平均效率低,较稳健但不优雅。
  • 方法 2:十进制位置,用floatnumeric存储行位置,插入容易但浮点精度有限,numeric精度可变但随列表重排空间消耗大,效率较高、不稳健但优雅。
  • 方法 3:真分数,使用pg_rational扩展进行精确分数运算,以 64 位存储分数,稳健且优雅,效率高。
  • 方法 4:真分数作为浮点数,计算用有理类型但存储为浮点数,比较快但分数转换有开销,貌似稳健但不如单独处理分数直接。
    重要细节:
  • float很快耗尽精度,numeric随整数部分增长需更多字节,pg_rational形成二叉树可精确计算分数。
  • 插入新项技巧,如插入在某两项之间、在列表末尾插入等。
  • 可添加btree索引到位置列,隐藏分数编号可通过row_number()函数。

结论:推荐使用pg_rational的真分数来存储列表顺序,给出使用该扩展的一些技巧,如插入项的方法、添加索引等,并提到可订阅 Begriffs 通讯。

阅读 8
0 条评论