在JavaScript和MySQL中存储列表排序顺序的替代方法
Alternative methods of storing a list sort order in JavaScript and MySQL
我有一个使用JavaScript和jQuery Sortable库的项目任务列表,可以方便地对任务列表项进行拖放排序。
当排序顺序发生变化时,顺序被保存到MySQL数据库中。目前,如果有100个任务列表项目,项目编号2被移动到位置3。这将使数据库中的记录2-100都在任务记录DB表中以sort_order
列更新。
这显然不是最有效的解决方案,因为它可能导致大量的DB记录被一次更新。
另一个问题是,这将导致我在任务记录上的date_modified
列全部更新,当任务上没有任何更改时,除了排序顺序号,这可能是由其他记录移动位置引起的。显然有办法解决这个问题,我目前已经编写了一个巨大的复杂的SQL查询,以确保不更新我的date_modified列,除非表上的其他列被修改。
所以这篇文章的原因是探索在大量记录中存储排序顺序的其他替代方法。
我的一个想法是创建新的数据库表task_sort_order
,它可以有列task_id
和sort_order
。然后该表将为每个Task记录保存一条记录。这种方法的好处是简化了SQL,因为我不必担心在排序顺序发生变化时更新Task记录日期字段。但是,它仍然需要立即更新相同数量的记录。在我最初的例子中,它仍然会在一次查询中大量更新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
值会被更改并保存到数据库中。
这看起来相当复杂,因为许多记录开始移动,你最终得到各种奇怪的奇数,它还必须以某种方式计算正确的数字,以确保新移动的项不与先前移动的项冲突。
正如你所看到的,我愿意听取任何关于其他方法的想法,甚至是改进我目前方法的方法。
我认为您的问题在于您如何在DB中存储订单的缺点。两个概念:
-
你可以尝试在你的关系数据库模式中实现链表的概念,即每个项目你存储一个"引用"到下一个项目。通过这种方式,每次重排只需要更新一些记录。
-
您可以使用像Neo4j或OrientDB这样的图形数据库,其中链表只是数据库本地支持的一种可能的数据输入链接。
- 为什么 then() 链式方法不按顺序运行
- 任何控制Javascript异步加载顺序的方法
- 按顺序调用javascript代码的替代方法,其间有延迟
- 有没有更好的方法以一定的顺序执行一堆部分异步的jQuery函数
- Javascript 方法执行顺序
- 方法未按正确的顺序/异步方法调用
- 在成功部分的Ajax发布方法中,发布数据的顺序和获取数据的顺序是不同的
- 是否有一种方法可以更改使用输入上传文件的顺序
- 在JavaScript和MySQL中存储列表排序顺序的替代方法
- 在Javascript中有顺序执行语句的方法吗?
- 用拖放的方法把单词按正确的顺序排列成句子
- 强制顺序执行javascript的另一种方法
- 使用jQuery改变元素顺序的最优方法
- 更好的方法有一个键值关系与保证顺序迭代javascript
- 有没有一种方法可以按照特定的顺序从数组中生成字符串?
- 各种加载函数/方法的执行顺序是什么
- 方法似乎没有按顺序运行
- 最快的方法来实现这个顺序
- 我不明白排序方法在这种情况下是如何工作的,我认为它是按字母顺序工作的,但是 #39;光线里的字不是,为什么
- 寻找一种更有效的方法来设置和更改顺序的骨干模型属性