簡體   English   中英

在 SQL 中存儲排序順序的最佳方法是什么?

[英]What's the best way to store sort order in SQL?

頂部的人希望在我們的應用程序中可以自定義排序順序。 所以我有一個有效定義數據類型的表。 存儲排序順序的最佳方式是什么。 如果我剛剛創建了一個名為“Order”之類的新列,那么每次我更新一行的順序時,我想我都必須更新每一行的順序以確保后代。 有更好的方法嗎?

到目前為止,沒有一個答案涉及自定義排序順序的真正問題,當兩個不同的人希望相同的記錄排序不同時會發生這種情況。

如果您需要自定義排序順序,則需要一個相關表來存儲它,而不是其他字段。 該表將具有userid,數據的recordId和記錄的排序順序。 這樣,Joe Smith可以擁有一個訂單而Sally Jones可以獲得相同的數據。 現在您遇到了將新記錄添加到數據集的問題。 您是將它們放在排序順序的開頭還是結尾處,或者您是否需要此人為它們設置訂單才能將它們添加到集合中。 這實際上是一個非常復雜的問題,通常不值得花時間來實現,因為幾乎沒有人使用該系統一旦到位(我的意思是我真的想要通過一百條記錄並標記個人每個人的順序?)。 現在它在保存所有記錄的順序方面變得復雜(當然,在下次運行查詢時需要更改,因為會有新的記錄。)這是一個非常痛苦的有限直到過程。

我在提案編寫應用程序中做了一次,因為我們需要能夠按照我們認為對客戶最令人印象深刻的順序對提案中的部件和任務進行排序。 即便如此,我們還是要制定一個默認訂單,這樣他們只需要先移動他們真正想要出現的兩三件事,而不是訂購10,000件零件。

一個更好的選擇,如果你可以讓他們買它,是允許他們按列(desc或asc)對數據進行排序。 通常可以設計用戶界面,以便在單擊列標題時,它將按該列求助數據。 這樣做相對簡單,滿足了定制訂購的大多數需求。

你真的需要與管理層討論這個要求,並獲得他們希望如何工作的詳細信息,我想要定制訂購。 這通常是人們認為他們想要的東西之一,但並沒有真正使用。

基本算法可能如下所述。 最初,排序字段因項目而異1000(您可以考慮另一個間隔)。 為簡單起見,表中的項目處於有序狀態。 順便說一下,我創建了Yii2組件來管理這些東西。 如果你需要一個可排序的樹可排序樹,那么這個

id | sort
---+-----
1  | 1000
---+-----
2  | 2000
---+-----
3  | 3000
---+-----

讓我們想象一下我們將在id 1之后添加一個項目(id 4):

id | sort
---+-----
1  | 1000
---+-----
4  | 1500
---+-----
2  | 2000
---+-----
3  | 3000
---+-----

因此,為了計算id 4的排序值,我們采用了之前項目的排序值,即1000和2000之后的項目並取平均值。 如果你得到一個浮點數,只需將它四舍五入到最接近的整數。 如果您需要在列表的開頭插入一個項目,則取平均值(1000和0,即500)。

現在,如果我們需要在id 1之后插入一個項目(id 5),我們也會這樣做:

id | sort
---+-----
1  | 1000
---+-----
5  | 1250
---+-----
4  | 1500
---+-----
2  | 2000
---+-----
3  | 3000
---+-----

稍后,您可能面臨這種情況:

id | sort
---+-----
1  | 1000
---+-----
15 | 1001
---+-----
...
---+-----
5  | 1250
---+-----
...
---+-----

因此,如果您需要在1到15之間插入一個項目(ID 16),首先應該將排序字段增加1000個所有項目后跟1:

id | sort
---+-----
1  | 1000
---+-----
15 | 2001
---+-----
...
---+-----
5  | 2250
---+-----
...
---+-----

現在您可以插入項目(ID 16):

id | sort
---+-----
1  | 1000
---+-----
16 | 1501
---+-----
15 | 2001
---+-----
...
---+-----
5  | 2250
---+-----
...
---+-----

使用int字段。 更新一行的排序順序時,只需更新要更新的行上的字段以及行的舊位置和新位置之間的任何行。 這意味着僅交換兩行涉及觸摸這兩行。 此外,對於您正在更新的不是“活動”行的行,您只需要遞增或遞減該字段; 查詢很容易編寫。

您可以使用浮點數,只要您具有足夠的精度,您始終只需將移動記錄的序號列設置為兩側記錄之間的中點即可。

通常,應用程序會將approriate ORDER BY子句添加到查詢中。 如果要排序的結果集相對較小,則可以在選擇條件上使用鍵。 即使有大的結果,通常最好對所選數據進行排序,而不是按索引按順序檢索。

如果要求是擁有像BAZTQMK這樣的訂單,那么您需要一個列來放置相對訂單。 每次添加行時都需要確定適當的值。 但是,這適用於相對靜態的代碼表。

暫無
暫無

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

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