2010-03-05 62 views
2

假設我有一個用戶表。 喜歡的東西:根據用戶交互排序行

ID integer, 
USER text, 
POSITION integer 

我的數據庫元組可以是:

(1, "user1", 1); 
(2, "user2", 2); 
(3, "user3", 3); 

我的應用程序列表中的所有用戶和它必須重新排序的可能性。 例如: 您可以讓user3在user2之前執行。

(1, "user1", 1); 
(2, "user2", 3); 
(3, "user3", 2); 

另外,您可能還想將某人移到第一位。 例如:如果你有...

(1, "user1", 1); 
(2, "user2", 2); 
(3, "user3", 3); 

...你移動用戶3至首位,數據庫應該是:

(1, "user1", 2); 
(2, "user2", 3); 
(3, "user3", 1); 

使用POSITION柱正確的做法? 有沒有辦法做到這一點沒有太多的點擊數據庫?

回答

2

如果您提出建議,您無法做得更好 - 每次更改時都會將更改後的元素更新到數據庫。這偶爾會意味着一個較小更改的較大更新(例如,在長列表的開頭添加一個元素)。

一個小的改進是刪除位置必須是從1開始的連續數字的限制。您可以改爲允許位置可以是100,200,300並使用ORDER BY以正確順序獲取行。通過這種方式,可以在兩個現有項目之間插入一個新項目,而無需修改任何其他元素,至少在您的序列超出間隙之前,您需要對其進行「碎片整理」。

但在我看來,實現這個系統的額外努力可能是不值得的。簡單的解決方案適用於大多數目的。

2

根據您的建議使用POSITION列完全有效。數據庫讀取的數量取決於您創建索引時表中的行數。

如果您指的是將用戶所做的更改保存回數據庫,除非需要提交很多更改,否則僅發出UPDATE語句就足夠了。