【问题标题】:Swap the order of items in a SQLite database交换 SQLite 数据库中项目的顺序
【发布时间】:2012-08-26 05:58:54
【问题描述】:

我从 Sqlite 数据库中的项目表中检索项目的有序列表。如何交换 id 以便 Sqlite 数据库表中的两个项目的顺序?

【问题讨论】:

  • 你最后做了什么?范围或链接对您有用吗?

标签: iphone sql ios ipad sqlite


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-02-25
    • 2018-04-09
    • 2019-04-04
    • 2012-10-27
    • 2016-04-07
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多