win*_*ith 25 database sorting database-design
假设我有一些对象,我希望用户能够以他们希望的任何方式对它们进行重新排序,例如,通过拖动它们.所以我有
然后用户将"牛奶"拖到顶部,进行新订单
是否有最佳实践如何将这些对象的顺序存储在数据库中?天真的方法可能只是为每个对象存储一个称为"顺序"的数值,但这对我来说似乎太麻烦了,因为你必须在大多数时间里改变顺序值.
Sea*_*ess 16
我发现处理这个问题的最好方法是有一个浮点顺序字段.当您在其他两个项目之间移动某些内容时,请将该字段设置为其邻居之间的中间位置.
这在读取和写入上都很便宜.唯一的缺点是花车越来越长:)
Mar*_*ark 12
考虑到Tony Andrews的回答,您可以选择在每个条目中存储"下一个"索引.然后当你把它们全部拉进去时,按照链条走完阵列.这使得移动项目更容易,因为您只需要触摸最多两行.
这种方法的缺点是,如果您需要一个子集(例如前三项),您仍然需要提取所有项目,或使用SQL循环.因此,在更新期间影响所有行或在读取期间访问所有项目之间.与以往一样,测量速度,看看哪种情况更适合您的情况.
特别是看托尼·安德鲁和马克的答案,看来我真的只有两种选择:
Meta:所有这些答案都是正确的,我应该选择哪一个正确?
在我的应用程序中,读取操作发生的频率比写入操作要频繁得多。使用数值来指示排序顺序并处理重新排序项目的成本。事实上,您可以以正确的顺序有效地检索项目以用于显示目的(在典型的应用程序中,这种情况比重新排序更频繁地发生)这一事实足以弥补这一点。
此外,正如已经提到的,如果您检索数据的子集(按类型或其他内容过滤),其余项目仍按正确的排序顺序。
记住口头禅 KISS