2010-12-06 79 views
0

我在我的網站上有一張表,用戶可以重新排列行。這部分很容易處理jQuery UI,使用$('#sortable').sortable("serialize")方法獲取新訂單很簡單。現在我的問題是,將所有這些記錄保存在數據庫中的最有效的方法是什麼?因爲更改一個項目的順序會更改表中的所有記錄?我知道我可以根據他們的ID爲每行創建一個新的UPDATE聲明,但我覺得必須有更好的方法。在那兒?有效更新多個記錄

我正在使用MySQL和ASP.NET。

+0

只是爲了澄清,你試圖存儲一個特定的排序順序,是否正確? – eykanal 2010-12-06 19:26:45

+0

@eykanal這是正確的。我有一個名爲「rank」的列,用於存儲記錄的順序。 – Jason 2010-12-06 19:30:37

回答

3

使用START TRANSACTION命令。這要快得多。

+0

我看過那篇文章,但並沒有真正解釋它的功能。你能詳細說明一下嗎?它只是一次提交所有更改而不是每次執行一個命令? – Jason 2010-12-06 19:35:38

+0

是的;如果一組語句在一個事務中,它們全部一起執行。除非你有一個非常大的表,否則在一個事務中做一整套更新是簡單而有效的。 – 2010-12-06 21:49:09

1

考慮到可能存在任意大量的行,我會將排序作爲文本字符串條目存儲在用戶首選項表中(假設您有這樣的表)。基本上,默認值是一個空條目(以節省磁盤空間),這意味着排序與數據庫中的排序不變,並且如果用戶更改它,則可以序列化行的順序(即,如果他們有第15行,那麼19,然後3,你可以有15-19-3),然後只讀出來。這是一個單一的更新,它無限期地縮放(直到文本字符串的長度,但mediumtextlongtext類型的)。


我離開上述以防萬一它是適用於其他人,但下面描述的特定情況下,我想我會考慮存儲在文本文件中的首選項。考慮到無論如何都會向用戶顯示順序,prefs不存在安全風險,因此您可以快速重寫整個事件。鑑於你如何描述它,我會使用一個兩列的CSV文件,但顯然你可以設置它,但最有意義。

對文件讀取速度的快速搜索導致this commentfile_get_contents()函數,這表明您可能要考慮文件將有多大,當考慮您將用於訪問文件中的數據的方法。我不知道寫作。

0

您的問題至少對我來說缺乏一些清晰度。我想你會展示一些我將通過ID〜等級參考的參賽作品。例如:

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] 

現在(這個不匹配自然等級順序)。

在我的例子,你應該做兩個更新查詢而不是6:

update XYZ set rank=4 where id = 24; 
update XYZ set rank=5 where id = 1; 

乾杯!