我从 Sqlite 数据库中的项目表中检索项目的有序列表。如何交换 id 以便 Sqlite 数据库表中两个项目的顺序?
1 回答
id 不应确定位置或顺序。它应该是一个不可变的标识符。
如果您需要在数据库中表示订单,则需要创建另一个 orderNumber 列。几个选项是(1)具有跨越范围的值或(2)具有指向下一个的指针(如链表)。
对于范围:跨越范围可帮助您避免在插入点之后为所有项目重写 orderNumber 列。例如,在范围内,插入第一个得到 1,插入第二个得到最大范围,在第一个和第二个之间插入第三个得到中间数字 - 如果你重新定位,你必须分配它之间的项目的中点。一个缺点是如果列表获得足够的流失(通过大跨度最小化),您可能需要重新平衡范围。这个解决方案的优点是你可以在 sql 语句中通过这个列排序来得到有序列表。
对于链表: 如果数据库有一个下一列指向它之后的 id,则需要更新几行以插入一些东西。好处是它很简单。缺点是你不能在 sql 语句中排序——你依赖于获取列表的代码来对其进行排序。
另一种变体是您可以将有序列表数据完全从该表中提取出来。例如,您可以有一个包含 listid、itemid、orderedNumber 的有序列表。这允许您在它引用的表中拥有一个或多个逻辑有序列表。
其他一些参考资料:
https://dba.stackexchange.com/questions/5683/how-to-design-a-database-for-storing-a-sorted-list