【问题标题】:Implement Editable Order of Items in MySQL在 MySQL 中实现项目的可编辑顺序
【发布时间】:2022-01-27 18:50:18
【问题描述】:

我想显示一个项目表,用户可以在其中添加、删除和重新排序项目。我认为将这些项目存储在 MySQL DB 中的第一种方法是在表中设置一个 order 列,但这似乎效率很低,因为当用户删除一个项目时,我需要更新以下所有项目的 order。如果我只是使用带有 id 或其他东西的 ORDER BY,我不知道如何让用户根据需要重新排序项目。您认为最好的处理方法是什么?

我使用的堆栈:React JS -> Node JS / Express -> MySQL

【问题讨论】:

  • 如果您认为您提出的order 列a) 必须是整数并且b) 必须不包含任何间隙,那么您将遇到您预期的问题。但是,如果您接受差距,则无需在删除时更新其他项目。如果您使用浮点数或等效项,那么在其他两个项目之间插入一个项目只需要您找到它们当前订单值的平均值(有时,如果有很多活动,这会崩溃,但你可以有一个“一次性”发生这种情况时重新排序整个表,仍然保持平均成本较低)
  • 例如,如果我的插入注释不明显。如果要在当前分配的订单 4 和 5 的项目之间插入新项目,则为其分配订单值 ((4+5)/2) = 4.5
  • 插入中间不是问题,添加总是在尾部。但是,如果我接受空白,感觉订单可能会失控,因为会有很多删除,并且有空白会有很多未使用的数字
  • 当您使用浮点数或小数时,大多数数字都未使用。选择任意两个数字,它们之间的数字更多。即使您使用整数并且有未使用的数字,那到底为什么会成为问题?

标签: mysql sql node.js reactjs express


【解决方案1】:

我见过的一种方法是有一个单独的列来说明它后面的项目的 ID。然后在您的查询中,您可以在选择使其按该顺序显示时从该列排序。

这意味着如果你删除一个字段,你只需要更新它后面的那个,然后在你刚刚删除的那个之前声明它的后面(那是一个跳跃的词......)

这有帮助吗?

【讨论】:

  • 一部分我觉得我完全错过了你问题的重点!
【解决方案2】:

您肯定需要一个新列来执行此排序。它需要存储的信息比您仅用项目 ID、名称等所能表示的信息还要多。

我已经通过您提到的order 专栏成功地做到了这一点。以下是我使用的一些技巧。

  • 不要担心删除一行时会发生什么。如果您的 order 列的值存在差距,一切都会正常工作。

  • 为您的order 列使用与自动递增id 列相同的数据类型(可能是BIGINT UNSIGNED),但允许使用NULL 值。

  • 使用ORDER BY COALESCE(order, id * 1000), id,因此您将使用id 值对从未设置过顺序的新插入行进行排序。新的行在最后。足够直观的默认行为。

  • 要将 ID 为 a 的项目放在 ID 为 b 的项目之后,请将 a 行中的 order 值更新为 COALESCE(b.order, id * 1000) + 1

这样

id    name    order   COALESCE(order, id*1000)
1     orange  NULL    1000
2     banana  NULL    2000
3     apple   NULL    3000
4     fig     NULL    4000

这使您的订单值为 1000、2000、3000、4000 等等。要在第二个项目之后订购第四个项目,您需要将其 order 设置为 2001。像这样

id    name    order   COALESCE(order, id*1000)
1     orange  NULL    1000
2     banana  NULL    2000
4     fig     2001    2001
3     apple   NULL    3000

如果您进行了足够多的重新排序以在任何给定项目之后插入超过 1000 个项目,则必须通过为整个表重写 order 列来清理它。如果您有一些相同的 order 值,那也没关系。我建议的 ORDER BY 子句将使它们保持原来的 ID 顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 2010-11-25
    • 2020-07-12
    • 2016-05-04
    相关资源
    最近更新 更多