2013-01-23 57 views
1

輕微相關Should I delete or disable a row in a relational database?替代isActive

鑑於我會去與倉儲改變我在一個歷史表的表的策略,我面臨着用於實現給定行狀態下列選項在MySQL:

  • isActive booelan
  • activeStatus枚舉
  • activeStatus INT引用一個小ActiveStatus查找TABL Ë
  • activeStatus INT不引用另一個表

第一種方法是在我看來很不靈活,因爲我可能需要在未來更布爾支持其他類型的活動狀態的(我不知道是什麼他們會,但可能像「被逐漸淘汰」或「對於隨機用戶羣體活躍」等)。

我被告知MySQL枚舉不好,所以第二種方法可能不會飛。

我喜歡第三種方法,但我想知道這是否是一個相對較小問題的重度解決方案。

第四種方法要求我們事先知道INT的每個狀態是什麼意思,似乎是一種過時的做事方式。

有沒有規範的正確答案?我是否忽略了另一種方法?

回答

2

就我個人而言,我會去你的第三個選項。

正如您所建議的那樣,布爾值在現實中往往變得更加複雜。 ENUM可以很好,但是他們有一個缺點:一旦你想存儲關於每個值的附加信息 - 誰添加了它,什麼時候,是否只對某個時間段或源系統有效,註釋等 - 變得困難,而通過查找表,這些數據可以很容易地保存在其他列中。 ENUM是將數據約束到特定值(如CHECK約束條件)的好工具,但如果這些值具有重要含義並需要向用戶公開,那麼這種工具就不是一個好工具。

從您的問題來看,您是否完全清楚您是否打算將歷史記錄表視爲事實表並在報表中使用它,但如果是這樣,那麼您可以將ActiveStatus查詢表視爲維度。在這種情況下,表格要容易得多,因爲您的報表工具可以從維度表中讀取可能的值,以便讓用戶選擇他的查詢條件;這些工具通常不瞭解任何關於ENUM的信息。

1

從我的角度來看,如果您的狀態超過2個,您的第二種方法會更好。因爲ENUM對於您知道會落入靜態集合的數據非常有用。但是,如果你只有兩個狀態活躍和不活躍,那麼它總是更好地使用布爾值。

編輯: 如果你確信在將來你不會改變你的ENUM的價值,那麼它很好的使用ENUM這樣的領域。

+0

我在很多地方都讀過,認爲在MySQL中使用'ENUM'通常不是一個好主意... –

+0

已經做了編輯 –

+0

** [8個理由爲什麼MySQL的ENUM數據類型是邪惡的](HTTP:// komlenic。COM /8分之244-原因-爲什麼-mysqls-枚舉數據類型是惡/)** –