代码之家  ›  专栏  ›  技术社区  ›  winsmith

如何将特定的、可变的“顺序”保存到数据库中

  •  24
  • winsmith  · 技术社区  · 17 年前

    • 干酪
    • 松饼

    然后用户将“牛奶”拖到顶部,做出新的订单

    • 牛奶
    • 干酪
    • 松饼

    7 回复  |  直到 7 年前
        1
  •  23
  •   Sean Clark Hess    12 年前

    我发现最好的处理方法是使用浮点顺序字段。在其他两个项目之间移动某个项目时,请将该字段设置为其相邻项之间的中间位置。

    这在读写方面都很便宜。唯一的缺点是浮动时间越来越长:)

        2
  •  16
  •   Tony Andrews    17 年前

    您建议的“天真”方法也是最佳实践!

        3
  •  13
  •   Mark    17 年前

    考虑到Tony Andrews的回答,您也可以为每个条目存储一个“next”索引。然后,当你把它们全部拉进去时,沿着链条在阵列中行走。这使得移动项目更容易,因为您最多只需触摸两行。

    这种方法的缺点是,如果您需要一个子集(例如前3个项),您仍然需要拉入所有项,或者使用SQL循环。因此,它介于更新期间影响所有行和读取期间访问所有项之间。和以往一样,测量速度,看看哪个更适合你的情况。

        4
  •  5
  •   winsmith    17 年前

    特别是看看托尼·安德鲁和马克的答案,我似乎真的只有两个选择:

    • 保存“下一个”值,使对象的行为类似于链表(请参见Mark的答案)
      然后 按“下一个”值对它们进行排序,这很昂贵
    • 保存“订单”值(参见Tony Andrew的答案)
      这使得检索成本很低,但保存新订单的成本可能很高,因为在最坏的情况下,我必须更改所有订单值。克莱特斯指出,可以使用2^n形式的大数作为阶数乘数。

    元:

        5
  •  4
  •   Jim Petkus    17 年前

    在我的应用程序中,读操作将比写操作频繁得多。使用数值指示排序顺序,并处理重新排序项目的成本。这可以通过以下事实来弥补:您可以按照正确的顺序高效地检索项目以用于显示目的(在典型的应用程序中,这种情况发生的频率比重新调用更高)。

    记住咒语K.I.S.S。

        6
  •  2
  •   tvanfosson    17 年前

    如果您想让它们以相同的顺序重新显示,并且希望它们能够在任何时候重新排序,我认为您都无法避免在数据库中存储一些指示显示优先级的值。我使用了你描述的方法,在FAQ中对项目进行排序,研究人员与补助金相关,菜单中的项目顺序。。。

        7
  •  1
  •   Ray Hidayat    17 年前

    是的,在关系数据库中没有顺序,这是基本概念之一。所以没有数值之类的东西是不可能的。

        8
  •  0
  •   Lion Great    6 年前

    您可以使用上一个Id,每次新插入都可以将上次插入的行Id设置为上一个Id,如下所示,

    table, td {
      border: .2px solid black
    }
    <table>
      <tr>
        <td>ID</td>
        <td>NAME</td>
        <td>PREV_ID</td>
      </tr>
      <tr>
        <td>1</td>
        <td>first_item</td>
        <td><i>&lt;null&gt;</i></td>
      </tr>
      <tr>
        <td>2</td>
        <td>second_item</td>
        <td>1</td>
      </tr>
      <tr>
        <td>3</td>
        <td>thid_item</td>
        <td>2</td>
      </tr>
    </table>

    任何时候重新排序时,都可以使用最后一行id轻松插入, 如果每次新插入时都使用下一个id,则需要更新上一个id, 如果在任何更新中使用排序顺序,则必须更新多行。 现在postgreSQL递归查询可用于选择

        9
  •  0
  •   Jonathan    5 年前

    理论上你可以使用 Order Statistic Tree 如果您希望以某个值获取特定元素,或者只是某种类型的 B-树 一般来说,要存储这些值。如果他们改变了,你也在改变 O(log n) 最坏情况下的项目。如果您有30000件物品,您只需更改4件或5件即可保留订单。