我的网站上有一个表,用户可以在其中重新排序行。这部分很容易使用jQuery UI,使用$('#sortable').sortable("serialize")
方法获取新订单很简单。我现在的问题是,在数据库中保存所有这些记录的最有效方法是什么,因为更改一个项目的顺序会更改表中的所有记录?我知道我可以根据他们的ID为每一行创建一个新的UPDATE
语句,但我觉得必须有更好的方法。有吗?
我正在使用MySQL和ASP.NET。
答案 0 :(得分:3)
使用START TRANSACTION
命令。这要快得多。
答案 1 :(得分:1)
鉴于可能存在任意数量的行,我会将排序存储为用户首选项表中的文本字符串条目(假设您有这样的表)。基本上,默认值是一个空条目(以节省磁盘空间),这意味着排序与数据库中的顺序没有变化,如果用户更改它,您可以只序列化行的顺序(即,如果他们先排第15行,然后是第19行,然后是第3行,你可以15-19-3
)然后只读出来。这是一个单一的更新,它无限缩放(好吧,直到文本字符串的长度,但mediumtext
和longtext
类型的pretty doggone big。
我将离开上面以防它适用于其他人,但对于下面描述的具体情况,我想我会考虑将prefs存储在文本文件中。鉴于无论如何向用户显示排序,prefs在明文文件中没有安全风险,您可以非常快速地重写整个事物。鉴于你在下面的描述,我会使用一个双列的CSV文件,但显然你可以设置它但是最有意义。
快速搜索文件读取速度导致file_get_contents()
函数this comment,这表示您在考虑使用的方法时可能需要注意文件的大小。访问文件中的数据。我不知道写作。
答案 2 :(得分:0)
至少对我来说,你的问题缺乏明确性。我想你会展示一些我将通过ID~levels引用的条目。例如:
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;
干杯!