【发布时间】:2012-08-26 05:58:54
【问题描述】:
我从 Sqlite 数据库中的项目表中检索项目的有序列表。如何交换 id 以便 Sqlite 数据库表中的两个项目的顺序?
【问题讨论】:
-
你最后做了什么?范围或链接对您有用吗?
标签: iphone sql ios ipad sqlite
我从 Sqlite 数据库中的项目表中检索项目的有序列表。如何交换 id 以便 Sqlite 数据库表中的两个项目的顺序?
【问题讨论】:
标签: iphone sql ios ipad sqlite
id 不应决定位置或顺序。它应该是一个不可变的标识符。
如果您需要在数据库中表示订单,您需要创建另一个 orderNumber 列。几个选项是 (1) 具有跨越范围的值或 (2) 具有指向下一个的指针(如链表)。
对于范围: 跨越范围有助于避免为插入点之后的所有项目重写 orderNumber 列。例如,在范围内,插入第一个得到 1,插入第二个得到最大范围,在第一个和第二个之间插入第三个得到中间数字 - 如果你重新定位,你必须分配它之间的项目的中点。一个缺点是如果列表有足够的流失(通过大跨度最小化),您可能需要重新平衡范围。这个方案的优点是你可以在sql语句中通过该列排序就可以得到有序列表。
对于链表:如果数据库有一个下一列指向它后面的 id,你需要更新几行来插入一些东西。好处是它很简单。缺点是你不能在 sql 语句中排序——你依赖于获取列表的代码来对其进行排序。
另一个变体是您可以将有序列表数据完全从该表中提取出来。例如,您可以有一个包含 listid、itemid、orderedNumber 的有序列表。这允许您拥有它所引用的表中项目的一个或多个逻辑有序列表。
其他一些参考资料:
How to store ordered items which often change position in DB
Best way to save a ordered List to the Database while keeping the ordering
https://dba.stackexchange.com/questions/5683/how-to-design-a-database-for-storing-a-sorted-list
【讨论】: