我的网站上有一个表格,用户可以在其中重新排序行。这部分使用 jQuery UI 很容易完成,使用该$('#sortable').sortable("serialize")
方法获取新订单也很简单。我现在的问题是,将所有这些记录保存在数据库中的最有效方法是什么,因为更改一项的顺序会更改表中的所有记录?我知道我可以UPDATE
根据他们的 ID 为每一行创建一个新语句,但我觉得必须有更好的方法。在那儿?
我正在使用 MySQL 和 ASP.NET。
我的网站上有一个表格,用户可以在其中重新排序行。这部分使用 jQuery UI 很容易完成,使用该$('#sortable').sortable("serialize")
方法获取新订单也很简单。我现在的问题是,将所有这些记录保存在数据库中的最有效方法是什么,因为更改一项的顺序会更改表中的所有记录?我知道我可以UPDATE
根据他们的 ID 为每一行创建一个新语句,但我觉得必须有更好的方法。在那儿?
我正在使用 MySQL 和 ASP.NET。
使用START TRANSACTION
命令。这要快得多。
鉴于可能存在任意数量的行,我会将排序作为文本字符串条目存储在用户首选项表中(假设您有这样的表)。基本上,默认值为空条目(以节省磁盘空间),这意味着排序与数据库中的排序相比没有变化,如果用户更改它,您只需序列化行的顺序(即,如果他们先有第 15 行,然后是第 19 行,然后是第 3 行,你可以有15-19-3
),然后把它读出来。这是一次更新,并且可以无限扩展(嗯,直到文本字符串的长度,但这对于and类型来说非常大)。mediumtext
longtext
我留下上面的内容以防万一它适用于其他人,但对于下面描述的特定情况,我想我会考虑将首选项存储在文本文件中。鉴于无论如何都会向用户显示排序,因此在明文文件中的首选项中没有安全风险,并且您可以非常快速地重写整个内容。鉴于您在下面的描述,我将使用一个两列的 CSV 文件,但显然您可以设置它,但最有意义。
对文件读取速度的快速搜索导致对该功能的评论file_get_contents()
,这表明您在考虑访问文件中数据的方法时可能需要注意文件的大小。我不知道写作。
至少对我来说,您的问题缺乏清晰度。我想你展示了几个我将通过 ID~rank 引用的条目。例如:
5~1
6~2
7~3
1~4
24~5
2~6
现在您说更改“一项的顺序会更改表中的所有记录”。这在您的设计中真的有必要吗?如果用户使用 id-s 1 和 24 切换元素,那么您将拥有以下序列化列表:
[5~1],[6~2],[7~3],[24~5],[1~4],[2~6]
现在通过迭代这个列表,您可以轻松地确定应该真正更新哪些行(这一行与排名的自然顺序不匹配)。
在我的示例中,您应该进行两个更新查询而不是六个:
update XYZ set rank=4 where id = 24;
update XYZ set rank=5 where id = 1;
干杯!