2012-02-21 46 views
1

我有一個存儲在數據庫表中的對象列表(稱爲「階段」)。什麼是一個很好的方法來模擬一個值表中的序列?

我需要維護列表中階段的順序。我想知道什麼是建模的好方法?

我想我會給Phase對象一個「int sequence」屬性來決定順序,既然它被保存到表中,我可以按順序讀回它們。我看到的唯一問題是,當我改變序列的順序時,我必須重新計算列表中每個階段的所有序列值。例如,交換#2和#3的位置會導致#3之後的所有內容(比如#1000)必須在db中更新。

有沒有一種更簡單的方法來模擬,我沒有考慮過?

+0

爲什麼你不能使用小數點排序? – 2012-02-21 16:33:58

+0

你可以把它作爲一種鏈表,而不是有一個'next_phase_id'的序號。不知道這是否會更容易。 – Russell 2012-02-21 16:36:39

+0

同樣在你的例子中,交換#2和#3並不意味着你需要更新任何其他的。 *刪除*#2或#3意味着你必須更新所有這些。 – Russell 2012-02-21 16:37:31

回答

1

我會按照你所描述的方式去做。

是,如果要插入新的值,然後如果你已經使用了連續的等級值,則需要撞擊現有值,說

UPDATE table SET rank = rank + 1 WHERE rank >= ? 

由此可見,你通常不能使排名列因爲你不知道UPDATE將以什麼順序處理。

如果您以編程方式訪問數據庫,您可以允許非連續的等級值,因此只有在不存在的情況下才會碰撞現有等級編號順序中沒有差距。另外,如果您使用的是基於行/基於頁面的數據庫,則可以考慮將排名帶到一個單獨的表中,該表中只有主記錄的ID和排名值。然後,如果您確實需要對排名進行大規模更新,則不必讀取和寫入整個主記錄,而只需要包含幾個整數的記錄。

1

如何在不影響任何其他記錄的情況下調換排序位置。

UPDATE 
    phases 
SET 
    sort_pos = CASE WHEN sort_pos = 2 THEN 3 ELSE 2 END 
WHERE 
    sort_pos IN (2, 3) 


你有一種「瀑布效應」的唯一情況是,當你移動一個記錄的排序順序中的新位置。

您可以通過將sort_pos存儲爲浮點來處理。因此,您可以將記錄推入排序位置2.5。唯一不利的一面是,你不能寫一個查詢說,「讓我第9件」,因爲它可能是排序爲98.5,或實際上任何其他值什麼如此。

相關問題