一個基本的用戶排序功能為什麼這麼難?
02-01
允許用戶在應用端對內容任意排序, 設計一個批量介面保存對內容順序的改變。
假設 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比哪個效率更高?