看板 Web_Design 關於我們 聯絡資訊
: 口水到這邊,小弟也來拋磚討論一下好了(雖然我論噗通沉沒的可能性… orz) : 不知道大家在可排序的資料的資料庫都是怎麼設計呢? : 例如一本相簿內,相片的排序,普通的建立方式應該就是 id / order 吧, : 例如: id title order : ------------------- : 33 相片一 1 : 34 相片二 2 : 35 相片三 3 這問題算滿常見的,應該已經有最佳解了吧? 我沒寫過,但未來有機會遇到,也想知道答案。 不過在還不知道答案的情況下,就來推敲推敲吧! 目前常見的相簿,都有相簿放多個照片,一本相簿可放照片數上限約為200張。 比較少像檔案總管那種無上限的,如果有,應該是不能自訂排序的, 亦即頂多只能依檔名、上傳/修改時間、大小、擁有者等方式排序。 在此我們假設每次要處理的量limit最多200筆。 (原po說1000筆,這種情形看能不能取消自訂,變成可改檔名再依檔名排序, 或是多增加一些「容器」,如tag、頁碼,減少每次要讀取、更新的照片總數) "photo" table 應該要有個欄位叫album,使得每一張相片可對應至一本相簿。 a.移動單筆時 我猜測原po描述的情況可能是一個列表,有「上下頂底」按鈕,按了之後可以把 目標往上下頂底移動,而不是像臉書相簿可滑鼠拖拉至任意位置。後者感覺比較 靈活,如果前者有個功能可將目標換至指定的第xx位置,那兩者才會比較相似。 假設從頭到尾只處理一個動作,由於使用者瀏覽時,系統已經把該有的資料都撈 出來了,而我們用ajax可以知道使用者要把id編號1對調到2,我會這樣做: ajax: exchange_photo?from=1&to=2 後端: "update table set pos = 1 where pos = 2 limit 1;" +"update table set pos = 2 where pos = 1 limit 1;" (同一個db connection內,一次執行兩個update指令) b.移動多筆時 我偏好等使用者動作都完畢後,再一次處理。使用者可以隨他高興的拖拖拉拉 上上下下調整照片、拼拼圖、打字,等到他按下「確定」或是離開頁面前,再 把最後的結果儲存起來。如此一來,http request數、db connection次數都 可以儘可能的低,即使sql指令可能會很長、很多。我是覺得控制前者數量比 較重要,sql指令下得好的話,一個指令才耗時0.000x秒,很多個也沒差。 最穩的作法是重新存所有照片順序,也就是不管只變動1張照片、200張照片全 亂掉或反轉順序,我都傳送200張的順序並儲存。 理論上有個作法叫linked list,photo table要有頭、尾兩個欄位,我只要傳 送(所有有被變動的照片的頭、尾)+(被牽連到的上家的尾、下家的頭)……呃, 有可能會搞得很複雜。再者,db似乎無法排序此資料結構,只能捉出來後再用 程式排。 其他作法我還想不到……整個頁面快照、快取?排序好的資料存成某種結構, json, tree?非關連式db的作法?雲端運算?XDDD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.122.76.198