【发布时间】:2015-04-28 10:01:20
【问题描述】:
我有一个 SQL 表 (PostgreSQL 9.3),它本质上是一个 ID 列和一个值列(例如 varchar)。我需要能够重现输入行的顺序。最天真的方法是要么依赖 ID 列的 AUTOINCREMENT 功能,要么有一个特定的列进行排序,比如说
CREATE TABLE "foo" (
"foo_id" SERIAL,
"order_index" int NOT NULL,
"value" VARCHAR(128)
);
数据可能看起来像
347 1 'foo'
368 2 'bar'
511 3 'baz'
我可以使用 ORDER BY "order_index" 子句检索它们。
问题是必须有可能稍后在特定位置插入另一行,例如当一行被意外遗漏时。在上述解决方案中,我必须重新分配插入位置之后的所有 order_index 值。这不能很好地扩展,有点与优雅相反。
一种解决方案是在初始分配中留下空白,因此上面的示例看起来像
347 1000 'foo'
368 2000 'bar'
511 3000 'baz'
可以插入行直到填补空白。只有这样才能进行重新分配。这是我迄今为止最好的主意。我还考虑了一种基于链表思想的解决方案,其中每行都有一个列“successor_id”。但是,在这种情况下,我无法使用简单的 ORDER BY 子句以有序的方式检索数据。
我一直想知道是否有一个可扩展且优雅的解决方案可能涉及不需要重新分配订单索引的两列。或者是否有某种最佳实践来处理这个问题?
【问题讨论】:
-
是什么让你想在第 1 行和第 2 行之间插入一行?我的意思是你怎么知道必须在那里放置一个新行?您的数据中是否有任何迹象表明这一点?
-
我刚刚在“考虑我”的评论中描述了它背后的现实问题。希望可以参考不同的评论而不是复制/粘贴它。
标签: sql postgresql sql-order-by