0

this question類似,但這些答案都不太理想。替代使用數據庫表中的排序順序列

考慮在PostgreSQL使用該Django的模型:

class Parent(models.Model): 
    id = models.AutoField(primary_key=True) 

class Child(models.Model): 
    id = models.AutoField(primary_key=True) 
    parent = models.ForeignKey(Parent) 

在SQL(希望我得到這個代碼右):

CREATE TABLE parent (
    id integer PRIMARY KEY 
); 

CREATE TABLE child (
    id integer PRIMARY KEY 
    parent_id integer REFERENCES parent 
); 

怎麼能夠做出讓Child對象屬於特定Parent可以重新排序嗎?即使用拖放UI,用戶可以拖動Child ren並保存更新的排序。創建,更新和刪除Child應只需要一次操作,即不應要求更新Parent上的內容。

我有原因的一些不完善的想法,爲什麼每個想法並不理想:

  1. 排序Child字母順序由用戶提供的VARCHAR - 這會強制用戶想開始具有一定的字母名稱或數字,因爲沒有正當理由而需要大量的創造力。

  2. Parent,存儲對應於Child對象的主鍵的整數數組 - 需要一個以上的操作創建和刪除,在Parent陣列將需要每次都被更新。沒有數據庫強制數據完整性。

  3. 按整數列排序Child - 創建Child以查找要使用的下一個整數時需要額外讀取。另一個問題(無論在生產中發生的可能性不大),當​​整數之間的差距用完時,插入對象「落後」的對象必須被推回。這種情況可以通過反覆考慮最後一個對象並把它放在第一位來人爲地強制。

  4. 在每個Child中,存儲引用下一個/前一個的整數ID Child - 這解決了一些來自3.的hacky問題,但它看起來荒謬的是效率低下,並且是後勤方面的挑戰。

是否有此規定(即不涉及另外加入或與jsonb替換第二表)任何雄辯的解決方案?

+1

使用3.您描述的問題是真實的,但可能並不重要,除非您每個父母的孩子數量非常多。 –

回答

0

如何使用float作爲排序順序列。當您插入/移動到項目時,將sortorder設置爲(previus-item.sortorter + next-item.sortorder)/ 2. 這不會無限運行,但取決於系統,您不應該遇到現實世界問題。此外,你可以有一個服務任務,在你的孩子的整理順序中重置空白。

+0

如果我不想要一夜之間的服務任務,最終浮動將會用完精確度,並且會默默無聞地維持秩序。這與整數的問題是一樣的,唯一不同的是浮點數更容易使用,但是它在什麼時候會「缺口」模糊不清。 – dtgq