2010-11-03 59 views
5

假設您想爲某些Web應用程序構建數據庫。這個數據庫已經包含很多表格,你可能不得不在將來擴展它。關係數據庫中「評論」表的最佳實踐

此外,您希望最終用戶能夠評論數據庫中的任何類型的對象。

我想找到一個解決方案,這將是足夠通用的,這樣我就不必每次在數據庫中添加一個新表時擴展它。

我想到了以下幾點:

表名:發表評論

  • ID:評論的ID
  • USER_ID:的的ID用戶發表評論
  • object_table_name:選項卡其中註釋對象爲
  • object_id:object_table_name表中已註釋對象的ID。
  • 文本:文本
  • 日期:依據

此表之類的解決我的問題,是困擾我的唯一的事情是,它的關係方面是比較薄弱(我不能讓例如,object_id是一個外鍵)。 另外如果有一天我需要重新命名一個表,我將不得不改變評論表中的所有有關條目。

您對這個解決方案有什麼看法?有設計模式可以幫助我嗎?

謝謝.-

+0

你需要保留這些評論的歷史記錄嗎?我想不出創建任何單獨的評論表的另一個主要原因。 – jwiscarson 2010-11-03 16:38:20

+0

每對(object_table_name,object_id)對可以有多個註釋嗎?如果它始終是1:1,那麼只需將註釋作爲額外列包含在object_table_name本身上。如果是1:N,那麼需要一個單獨的表格。 – 2010-11-03 20:41:40

回答

5

這不是更清潔嗎?

comment_set

  • ID

評論

  • ID
  • comment_set_id - >外鍵comment_set
  • user_id說明
  • 日期
  • 文本

現有表

  • ...
  • comment_set_id - >外鍵comment_set

現有表酒吧

  • ...
  • comment_set_id - >外鍵comment_set
+0

因此,除非您發表評論,否則您將無法將數據插入「foo」或「bar」中? – Quassnoi 2010-11-03 16:28:15

+0

@Quassnoi爲什麼?外鍵可以爲空,或者註釋集可以爲空。 – 2010-11-03 18:01:20

+0

爲什麼有他們呢?另外,你如何確保'foo'和'bar'不引用相同的'comment_set'? – Quassnoi 2010-11-03 18:05:38

1

您正在混合數據和元數據,這不是最好的設計模式。他們應該分開。

但是,由於評論似乎不是非常重要,無論如何,你的解決方案是好的。最糟糕的事情可能是失去對你的對象的評論。

一些數據庫,最值得注意的是,PostgreSQL,支持COMMENT子句只是爲了這樣的情況。

更新:

如果你想在每個表中單獨記錄發表評論,這是確定有這樣的表。

object_table_name如果您重命名錶,則不必更改,因爲它是數據而不是元數據。

你不能編寫一個本地SQL查詢,它將獲取任何表的記錄的註釋(查詢開發時刻不知道),儘管你可以構建動態查詢來完成該操作。

在這種情況下,您必須保持數據和元數據同步(UPDATE評論表,當您參照表RENAME時)。第一個是DML聲明(更改數據),第二個是DDL(更改元數據)。

還要確保所有PRIMARY KEYs都具有相同的類型(與object_id相同)。

+0

我想OP希望用戶評論ROWS(對象到用戶),而不是數據庫對象,如表或索引。 – 2010-11-03 16:03:47

+0

@Larry:你可能是對的,雖然從帖子中不是那麼明顯:) – Quassnoi 2010-11-03 16:16:49

+0

是的,抱歉的含糊不清。我需要評論表格的行。 – Alexandre 2010-11-03 16:47:34

0

閱讀關於EAV。 你可以使你的整個數據庫。但接下來它將會與這些數據一起工作。

爲什麼你不想爲每個應該支持註釋的數據庫實體放置Comment屬性?通過這種方式,您可以在單個查詢中獲取所需的所有數據,而且許多用於數據庫的GUI程序將爲您提供SQL中的完整代碼完成功能,這將防止在使用字符串操作時很容易發生的錯誤。這種方式代碼嚴重依賴於程序代碼,這對數據庫系統來說是不正確的。

0

您可以在單獨的表中枚舉表名,以便更改名稱不會以任何主要方式影響系統。只需更新枚舉表。

雖然你是從參照完整性中疏遠你的自我,我可以看到另一種方法來實現你想要的。

0

我通常更喜歡保留與他們適用的行的評論。假設你的數據庫有效地存儲了空的VARCHAR字段,你不應該爲此付出代價。當你實現這種方法時,沒有什麼可以「擴展」的,維護註釋成爲你已經用來更新行的查詢的一部分。

單筆記表方法的唯一好處是它允許在筆記中輕鬆搜索不同類型的數據庫條目。

0

假設MS SQL,並且如果數量相對較小,您似乎建議,那麼Extended Properties可能值得探索。過去我已經成功地使用了它們,它們似乎是一個永久的固定裝置。