我試圖建立一個維基百科喜歡的東西,在那裏多人可以編輯的內容。有特權的人也可以恢復更改。我不希望反轉是有損的(意味着真的放棄了人們編輯的編輯,它只應該隱藏它),所以這似乎需要像數據結構這樣的git分支用指向「當前」的指針存儲編輯。如何在postgresql中存儲像數據結構的git分支?
我想這樣的設計:
CREATE TABLE article (
id serial PRIMARY KEY,
content text NOT NULL,
author integer NOT NULL REFERENCES "user",
path text NOT NULL,
relationship ltree NOT NULL
);
CREATE TABLE current_article (
article_id NOT NULL REFERENCES article
);
凡relationship
記錄,如果它是一個新的文章或現有項目的編輯:
id | content | path | author | relationship
---+---------+------+--------+-------------
1 | foo | /a1 | 1 | 'root'
2 | bar | /a1 | 2 | 'root.1'
3 | baz | /a2 | 3 | 'root'
在這裏,它的意思,筆者2從改變文章/a1
foo來吧,文章/a2
是一個新的。
current_article
記錄哪篇文章是「當前」文章,通常只是指向最新文章。迴歸後,它可以指向一老一:
article_id
----------
2
3
當編輯進來,我插入這樣的:
INSERT INTO article (content, path, author) VALUES ('qux', '/a2', 4);
並依靠一個INSERT觸發器之前找到當前文章該路徑和填充關係以及後插入觸發器來更新當前文章指針。
您對這種設計有什麼看法?我在設計這個問題時遇到了併發問題。
在之前的插入觸發器中,到它找到當前項目時,它可能已被更改,並且在插入後觸發器中,它可能會錯誤地覆蓋當前項目,並且已指向不同的項目。
我在這方面有三個問題:
- 將串行隔離解決這個問題? (我對MVCC的概念相當陌生,仍然試圖繞過它的頭)如果不是,我該如何解決它?
- 有沒有更好的設計,不必處理併發?
- 如果確實需要處理併發性,我該如何在不同的競爭條件下單元測試我的設計(或者甚至是必要的單元測試)?
謝謝。
你是對的,編輯不知道它基於哪個版本。客戶也應該發送他們基於的文章ID,我會更新。但是,我不太瞭解應用程序會話的相關性。兩個用戶可以同時進行編輯,如果先保存,另一個將在保存時通知衝突。所以我不應該只需要處理數據庫併發性?這是我遇到的困難。 – hgl
@hgl:編輯後添加更多關於數據庫併發性方面的信息。 –