一個基本的用戶排序功能為什麼這麼難?

允許用戶在應用端對內容任意排序, 設計一個批量介面保存對內容順序的改變。

假設 app上展示了六個內容, abcdef, 用戶通過拖動將內容順序改變為bcdefa並通過一個介面上傳對順序的改變。

問題是:

如何在關係型資料庫中合適的建表, 使得通過一個簡單的介面能夠【批量地】進行如上的用戶自定義排序工作?

目前能想到的解決策略:

1) 維護一個順序字串

顯然不是一個好的策略, 當內容規模很大時, 需要多次遍歷此字元串。

2) 在資料庫中建立一個內容序的鏈表結構

改變順序時,需要改變表中的多項, 數據一致性不好。

3) 給每個內容添加一個內容權重, 通過改變內容的權重改變順序。

此方法在均攤O(1)時間內可以完成改變順序, 但是不易批量化。

求助各位大神了。


謝邀。

1.你之所以糾結,是因為你搞錯了問題的解決步驟。

對於一個問題,正確的做法是,先按照科學、合理的方式解決了,然後再談提高性能。

2.解決問題:

去設計一個數據結構,要符合範式、不要有冗餘,然後把它做到資料庫里。這個階段,只考慮科學合理,不要考慮性能。

3.提高性能:

想辦法利用批量讀寫、添加冗餘、增加前置高性能緩存等方式來提高性能。這個階段,就不要管什麼科學合理了,怎麼高性能就怎麼來。


用方案1即可 通過保存校驗和減少各個終端的拉取次數(根據校驗和判斷順序是否發生變化 如果沒有變化則不進行更新列表的請求) 再將變更順序的請求merge 批量更新

不過這一切的前提是 "內容"的個數是可控的


如果是我,我會新建一個關聯表,關聯表中有個欄位保存內容id的連續字元串,形如:

userid | contentid

---------------------

1 | 3,2,5,1,7

用戶修改順序直接把這個欄位覆蓋掉,用新的順序字元串代替。題主覺得可否?


用戶的每個綁定的內容加個屬性,整數,作為排序的依據,可以嗎?


我估計上個全文檢索引擎就都搞定了。排序隨便改也不影響。


鏈表?。。應該可以吧


同樣遇到這個問題,要為每個用戶保存多個內容自定義的排序,目前採用的是你的方案一,把用戶最終的排序保存到一個數組中,然後採用 Rails 的 serialize 的方法,把數組存入資料庫,方案二不太懂是什麼意思,方案三的方式在一對多的情境下使用過,前端拖動用JS更改權重為最終位置上一個和下一個的均值,保存的時候提交更新每個內容最終的權重。


推薦閱讀:

pymongo 查詢時,顯示循環不同,為何效率相差百倍?
有多少人按@蕭井陌大神給出的Python+Flask路線找到工作了?
深入描述符
shell腳本做文本解析同php和python比哪個效率更高?

TAG:Ruby | Python | MySQL | 應用開發 | C |