我有一个使用JavaScript的项目任务列表和jQuery Sortable库,可以轻松拖放任务列表项的排序。
当排序顺序改变时,订单将保存到MySQL数据库。目前,如果有100个任务列表项,并且项目编号2移动到位置3.这将使记录2-100全部在数据库中更新,任务记录数据库表上有sort_order
列。
这显然不是最有效的解决方案,因为它可以导致大量的DB记录一次更新。
另一个问题是,当任务中的任何内容都没有改变时,这将导致我的任务记录中的date_modified
列全部更新,除了可能由其他记录转移位置引起的排序顺序号。显然有很多方法可以解决这个问题,我目前已经在一个巨大的复杂SQL查询中进行了编码,确保不会更新我的date_modified列,除非修改了表中的其他列。
所以这篇文章的原因是探索在大量记录上存储排序顺序的其他替代方法。
我的一个想法是创建新的数据库表task_sort_order
,其中可能包含task_id
和sort_order
列。然后,该表将保存每个任务记录的记录。这种方法的好处是我的SQL将被简化,因为我不必担心只有排序顺序发生变化时更新的任务记录日期字段。但是,它仍然需要同时更新相同数量的记录。在我的原始示例中,它仍然会在1个查询中大量更新100个记录中的99个记录。它似乎确实比我现在的好处。
在将大量排序顺序存储到数据库时,还有其他方法可以改进吗?
我见过一些人也会以10的增量或其他数字保存每个排序订单号,以便例如有5条记录1=10, 2=20, 3=30, 4=40, 5=50
而记录号2转移到第4位。它会有一个1=10, 3=30, 4=40, 2=44, 5=50
的新排序顺序,因此在此示例中,只有记录号为2的sort_order
值会更改并保存到数据库中。
这似乎相当复杂,因为许多记录开始被移动并且你最终得到各种奇怪的奇数,并且它还必须以某种方式计算正确的数字以确保新移动的项目与之前移动的不冲突项目
您可以看到我愿意听取其他方法的任何想法,甚至改进现有方法的方法吗?
答案 0 :(得分:2)
我认为您的问题在于如何在DB中存储订单的缺点。两个想法:
您可以尝试在关系数据库架构中实现链接列表的概念,即每个项目存储"引用"到下一个项目。通过这种方式,您只需每次重新安排更新一些记录。
您可以使用图形数据库,例如Neo4j或OrientDB,其中链表只是数据库本机支持的可能数据输入链接之一。