2009-07-16 77 views
1

我需要創建一個沒有文章被刪除的文章系統。更重要的是,他們希望所有文章的編輯,一旦保存了原文,就可以創建新文章而不是覆蓋舊文章。沒有刪除數據庫表

因此,人A寫文章1並保存它。 人B編輯文章1.

組織此數據庫的最佳方法是什麼?我的想法是:

  • 文章,
  • 文章,
  • ID,
  • old_id(編輯前項目的ID,讓用戶可以 '撤銷'),
  • 刪除(布爾值,如果刪除它不會在系統中,除非用戶意見 '垃圾')顯示,
  • 標題,
  • 文章,
  • 創建(冗餘?),
  • 已更新(上次更新日期),
  • user_id(上次更新文章的用戶的ID)。

所以,當用戶編輯一篇文章時,它會創建一個新的文章記錄,但保存舊的文章ID作爲參考。

這是最好的方式去了解它還是有一個更有效的方法?

回答

2

您可以讓同一篇文章出現在同一張表中,但ID值不同。您可以根據最高ID或者設置布爾值(如「isActive」)來確定活動文章。

這與SO和維基百科處理修訂歷史的方式類似。

 
PK | ID |  Title   |  Text  | Edited | Edited By 
----------------------------------------------------------------------------- 
1 | 128 | History of Computin | The History of... | 2009/07/10 | Jon Sampson 
2 | 128 | History of Computing | The History of... | 2009/07/11 | John Smith 

在這種情況下,我可以看到第128條被編輯。最新版本是John Smith的#2。

+0

將文章存儲在新表中還是應該將它們留在當前表中?我不認爲這個系統會承受很大的壓力,但我仍然希望它有效。 – Brad 2009-07-16 15:02:32

2

維基百科的做法是它有一張表,名爲「cur」的IIRC僅包含每篇文章的當前版本和包含所有先前版本的第二個表。

好處是,如果表格較小,並且不需要檢查關鍵字和一些指示是否最新的標誌,那麼對「cur」的查找可能會更快。

1
TABLE Revisions: 
ID 
FK_Articles (Articles.ID) 
Status (active, deleted, etc) 
Content 
Metadata (timestamp, user data, etc) 

TABLE Articles: 
ID 
FK_Revisions (Revisions.ID - current revision of the article) 
1

是的,我願意爲此而努力。一個狀態列,包含「A」(活動),「D」(刪除),「P」(等待編輯審批)等。

您可能希望爲文章的投放時間添加一項功能,因爲很多系統可能需要等待一段時間才顯示文章,但文章會事先上傳。

您可能希望保留一個靜態文章標識符,以便即使文章被更新,具有該標識符的URL也能繼續工作。可能值得擁有一個鏈接靜態文章標識符與當前活動文章ID(外鍵)的表格。

如果您將擁有超過百萬條的文章,那麼可能有一個系統將文章表格的舊修訂版本從文章表格移動到已歸檔的文章表格。