2011-08-30 86 views
2

在數據庫中存儲請求的「正確」(最規範化?)方式是什麼?例如,用戶提交文章。本文在發佈到網站之前必須經過審覈和批准。在Mysql(或任何)數據庫中存儲請求的正確方法

哪個是更合適的方式:

A)它在文章表具有 「已批准」 字段,它要麼是0,1,2(拒絕,批准,待定)

存儲或

B)有ArticleRequests表,它具有與Articles相同的字段,並且在批准後,將行數據從ArticleRequests移動到Articles。

謝謝!

+3

我會爲A保證。 – Shef

+0

我投贊成票A:這種方式可以輕鬆實現「刪除」,「標記」(如垃圾郵件等)等。從TableA移動一行到TableB可能會出錯,最終導致兩篇文章或根本沒有。 –

回答

4

由於每篇文章都將具有審批狀態,並且每次請求文章時,您都很可能需要知道該狀態 - 將其與表格保持內聯。

不過,考慮調用字段ApprovalStatus。您可能希望添加一個相關的表格來包含每個狀態,除非它們不會經常更改(或永遠)。

編輯:理由繼續在相關表中的字段有:

  • 如果相關領域並不總是適用的,或者可能經常是null
  • 如果僅在極少情況下才需要相關字段,並且通過將外鍵用於關聯屬性的相關表中可以更好地進行描述。

在你的情況下,上述原因不適用。

+0

+1表示字段名稱。 –

+0

我在選擇A時遇到的問題是,每次您執行SELECT語句選擇並顯示文章時,都需要檢查ApprovalStatus是否已標記爲已批准。如果您選擇B,則「文章」表中的所有文章都將被批准,並且不在該表格中的所有文章都不會被批准。 –

+0

@John:有效的點,但這是一個簡單的步驟,用'ApprovalStatus = 1'(其中'1'是「批准的」)添加一個WHERE子句......你甚至可以創建一個名爲'ApprovedArticles'的視圖來封裝那邏輯。 – Yuck

1

我認爲最好是將數據存儲在具有特定狀態的主表中。因爲沒有必要在表格之間移動數據,如果這個數據被批准並且文章將同時出現在網站上。如果您不想存儲已拒登的文章,則應該創建cron腳本,並刪除不必要的數據或將其移至歸檔表格。在這種情況下,你將減少加載你的分貝,因爲你可以調整適當的時間去除舊的文章,例如在晚上。

關於在每個查詢中使用審批狀態的問題:如果您打算使用高負載的非常流行的站點來搜索或製作文章列表,您將使用獨立服務器,如sphinx或solr(mysql對此不是很好的解決方案目的),你會把數據放到這些狀態='批准'。使用增量索引可幫助您保持數據最新。

2

絕對做'A'。

如果你做B,你將創建一個與另一個相同的字段的新表,這意味着你做錯了什麼。你在重複自己。

相關問題