Database-Design
更改單行的排序/排序值時更新所有行?
我正在創建一個 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