Database-Design

更改單行的排序/排序值時更新所有行?

  • January 15, 2016

我正在創建一個 GIS 應用程序,該應用程序具有多個圖層和每個圖層上的許多內容形狀。目前,每個圖層/形狀都是按照從數據庫返回的順序繪製的,但我想讓使用者對排序進行一些控制。所以使用者應該能夠在圖層樹中上下拖放圖層/形狀,這應該會改變繪圖順序。

為了保持這些更改,每個層/形狀必須在數據庫中具有 som 排序/排序索引。但是,如果我使用整數作為排序鍵,則每當將圖層/形狀排序到新位置時,這將需要使用 +1 更新以下所有行。

有沒有避免這種情況的好方法?

我想避免這個問題的原因是層中可能有很多內容(數千個形狀),我擔心更新這麼多行對性能的影響。此外,這不是一個非常優雅的解決方案。

我已經考慮過使用浮點值,這樣可以在兩個現有值之間簡單地創建一個新值,但最終可能會遇到精度問題。

我正在考慮的另一種方法是將排序順序儲存為一種鍊錶,其中每一行都指向前一行或後一行,這將減少所需的更新次數,但會使 GUI 中樹的構造更加複雜。更糟糕的是,如果不是所有形狀/圖層都始終顯示,創建圖層/形狀樹將變得不可能。

這類問題有普遍接受的良好解決方案嗎?

我以前從未處理過這樣的事情,但為什麼不將 +1 和十進製版本結合起來。在他們編輯時進行十進製版本控制..然後在編輯會話結束時(當他們進行最終保存時)繼續並將所有值重寫為整數。大概在任何給定的編輯期間都不會有太多的編輯,以至於您會在精度方面遇到重大問題。

另一種選擇是在項目表中的單個列中使用列表。基本上,您的 ID 會沿著這些行列在那裡。

,43,23,14,55,27,等等。

然後,您可以使用字元串操作將 ,55 從它所在的位置刪除,並將其填充在 23 到 14 之間。在 SQL Server 中,T-SQL 程式碼可能如下所示:

DECLARE @OrderString varchar(500) = ',43,23,14,55,27,'
DECLARE @MoveString varchar(50) = '55'
DECLARE @MoveBefore varchar(50) = '14'

-- Remove the value to be moved
SET @OrderString = STUFF(@OrderString, PATINDEX('%,'+@MoveString+',%', @OrderString), LEN(@MoveString)+2,',')

-- Put it in the right place
SET @OrderString = STUFF(@OrderString, PATINDEX('%,'+@MoveBefore+',%',@OrderString),0,','+@MoveString)

-- Print it out
PRINT @OrderString

引用自:https://dba.stackexchange.com/questions/126388