【问题标题】:Best way to rearrange order of db tables items?重新排列数据库表项目顺序的最佳方法?
【发布时间】:2023-03-03 05:17:21
【问题描述】:

我有一个没有特定顺序的项目数据库表。我希望用户能够根据他们认为项目的重要性对项目进行排序和重新排序。解决这个问题的最佳方法是什么?想想一个待办事项列表,人们可以按照他们想要做的顺序来订购。

我在 php/codeigniter 中执行此操作,但非常欢迎整体方法的想法。谢谢。

【问题讨论】:

  • 关系数据库没有默认的行顺序。您可以按照您喜欢的顺序在 select 中按 column_name 排序

标签: php mysql sql codeigniter codeigniter-3


【解决方案1】:

换句话说,用户可以按任意顺序排列项目,而这种排序需要持久化在数据库中?

正如一位评论者指出的那样,数据库中的行没有固有的顺序。任何需要特定序列中的行的检索都需要通过 ORDER BY 子句声明所需的序列。

对于您的建议,与其合并一个列来将排序信息直接存储在您的数据表中,我建议使用一个包含两列的一对一连接表 - 一个是行的主键,另一个是second 用于存储保存用户序列的整数。这允许在不实际修改行本身的情况下更改序列(保留缓存等)。例如,像这样的表:

CREATE TABLE UserSequence(
    key INT UNSIGNED,
    sequence INT UNSIGNED)

“key”列是保存数据行的表的主键的外键。

如果您对序列使用较大的数字(例如,序数 x 1000),您将为用户留出空间来创建新项目(或重新排序现有项目),优先级位于序列中间的某个位置,而无需重新编号所有行.

然后按顺序检索很简单,只需在查询中加入 UserSequence 表并按顺序列排序即可。

另外请注意,您可以在序列列上设置唯一性约束,这将允许数据库根据您选择的步幅值(例如 1000)告诉您何时需要回退并重新编号项目,而不是而不是进行中间序列插入(例如,通过prev + (next - prev)/2 之类的方式选择序列值)。 key 列上的外键约束也是可取的。

【讨论】:

  • "也就是说,用户可以按任意顺序排列项目,而这种排序需要持久化在数据库中吗?"对,就是这样。谢谢。
  • 酷 - 这是我的回答所基于的假设。
猜你喜欢
  • 2022-01-21
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
相关资源
最近更新 更多