簡體   English   中英

我應該如何將已排序的項目存儲在數據庫中?

[英]How should I store sorted items in a database?

在我的應用程序中,用戶可以按照他們選擇的順序重新排列他們喜愛的書籍。

我的數據庫中有一個“書籍”表,每本書都有一行。 目前,有一個名為“position”的整數列,用於存儲每本書的位置:1為頂級書籍,2為下一本書,等等。

問題是,如果有人將書從位置#11000拖到位置#1,那么我必須對數據庫進行11,000次更新。 這似乎效率低下。 有一個更好的方法嗎?

我曾經有過的一個想法就是讓另一個名為“book_sort_orderings”的表或其他東西,每個用戶都有一行。 一列是一個巨大的文本列,用於存儲書籍ID的排序列表。 然后,當用戶重新排列書籍時,我可以將此值拉出到我的代碼中,在那里執行重新排列,並更新數據庫行。 當然,每當添加或刪除一本書時,我都必須更新這個數組。 這是處理事情的“正確”方式嗎? 或者有什么聰明的我可以做的事情來加快速度而不改變我目前的設置?

假設您以“批量”方式執行此操作(而不是為每行進行單獨的數據庫往返),您會驚訝於一個體面的DBMS可以快速更新11,000行。

但是如果你想避免這種情況,那就使用舊的BASIC技巧(從BASIC的時候還有行號): 留下空白!

而不是使用位置: 1, 2, 3, 4, 5 etc...使用10, 20, 30, 40, 50 etc...

所以當你需要將第一個項目移動到倒數第二個位置時,只需修改10到41,你最終會得到: 20, 30, 40, 41, 50 etc... 顯然,如果差距被完全填滿,你需要做一些擺弄,但這個策略應該能夠幾乎消除大量的UPDATE。


另一種可能性是實現雙向鏈表:而不是訂單,保留前一個和下一個項的ID。 重新排序可以通過簡單地“重新鏈接”ID來完成,就像在內存列表中一樣。 不幸的是,您還會阻止DBMS直接對項目進行排序(至少沒有笨拙且可能效率低下的遞歸查詢) - 您必須在應用程序級別進行排序,所以我建議再次對它進行排序


一列是一個巨大的文本列,用於存儲書籍ID的排序列表。

請不要這樣做。 你違反了1NF並且有很好的理由不這樣做,包括數據的一致性和性能(你必須重寫整個字段,以便對它的任何部分進行任何單一更改)。

您當前的解決方案似乎不適用於多個用戶設置。 如果在Book表中設置了圖書的訂單,那么它對所有用戶都不是永久性的嗎?

正如其他人所提到的,通常最好將數據標准化,這需要您添加另一個表,就像您所建議的那樣。 所以你可以有一個新的BookOrdering表。 所以它有一個book_id ,一個user_idposition列。 這樣,每個用戶和每本書都有一個指定的位置。

因此會有一個默認排序(不會存儲在此表中),但用戶可以更改順序。 該表僅記錄默認值的更改。 如果要加載用戶的書籍,首先要檢查此表格中是否有某個user_id,然后相應地切換/調整順序。

使用幾個SQL語句更新示例中的所有行並不是很難。 您不需要在DBMS上發出11,000個更新(我認為這是您想要說的)。

首先,更新所有正在洗牌的書籍:

UPDATE book
SET position = position + 1
WHERE position < 11000
AND position >= 1

...然后設置你正在移動的書的位置:

UPDATE book
SET position = 1
WHERE id = whatever

1. 另一個想法:

在列表中標識新的varchar列(orderCode)。 此列以char格式存儲每個項目的順序,如下:

'1','2','3','4','5','6', '7', '8', '9', '91', '92',....

現在,如果要插入1到2之間的項,則orederCode的值將為“11”。列表順序為:

'1','11','2','3','4','5','6', '7', '8', '9', '91', '92',....

現在我們假設您將插入11和2之間,您將插入orderCode value ='12':

'1','11','12','2','3','4','5','6', '7', '8', '9', '91', '92',....

最后,如果要插入“11”和“12”中的項目,則訂單值將為:'111':

'1','11','111','12','2','3','4','5','6', '7', '8', '9', '91', '92',....'99','991,...

您可以不時運行查詢以將訂單值修復為一個char。

2. 更好的解決方案

使用浮點數據類型而不是varchar。 所以這個清單:

'1', '11', '111', '12', '2', '3', '4', '5', '6', '7', '8', '9', '91', '92',....

就像吼叫:

  0.1, 0.11, 0.111, 0,12, 0.3, 0.4, 0.5, 0.6, ......,0.9,0.91,....

反之,浮點排序比varchar排序更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM