2013-03-26 23 views
0

我在我的數據庫表格中有兩個「狀態」列,但每個列表都有相同的狀態類型。例如,作者可以具有以下狀態:掛起,活動,無效,暫停。這些相同的狀態類型適用於已發佈文章的狀態。是否有一種簡單的方法來在數據庫列中定義項目列表

對STATUS下的任一表使用char()並輸入4個列出的狀態之一是否合適?或者是否爲每個類型創建一個帶有STATUS_ID和STATUS_type的「STATUS」表的狀態,然後在表或將來的表中使用STATUS_ID外鍵?

只需在任一4種類型的輸入是最簡單的方式,但我想他們可能是用戶錯誤的可能性...

感謝

回答

1

您可以使用enum字段數據類型來強制值必須是預選的一組值。在幕後MySQL實際上將這些值存儲爲整數來表示以節省存儲需求。

無論你是否需要一個單獨的表是否真的取決於你。如果您認爲允許值的集合需要隨着時間的推移而動態變化,那麼也許這很有意義(使用外鍵約束來強制選擇其中一個值)。如果這些值實際上代表了系統中某些需要與它們關聯的屬性(字段)的真實世界對象,那麼您也可以從單獨的表中獲取值。

+0

我會考慮這個想法......現在,我只需要一個基本的 「狀態」 字段來跟蹤作者...不勝感激! – 2013-03-26 21:55:23

+0

@corradorotondella然後枚舉可能是你最好的選擇。 – 2013-03-26 22:03:39

0

最直接的方法是enum數據類型,第二個表格也可以很好地工作,但它更復雜。

0

一個單獨的狀態查找表是要走的路。它實際上可能會減慢查詢速度,因爲您正在添加連接,但規範化優勢超過了它。最大的實際好處是它使更改狀態名稱更加容易。如果您想將「待處理」更改爲「處理中」,則只需更改1個字段。

0

如果您打算在WHERE子句中頻繁使用此列,那麼最好爲其創建另一個表。

+0

如果你經常在where子句中使用它,爲什麼還要有另一個表? – Vatev 2013-03-26 21:12:39

+0

因爲比較兩個整數比兩個字符串更快。 – w770115 2013-03-26 21:16:31

0

您對狀態表的建議是合理的,並且是一種常見做法。根據您使用的編程語言,enum將是一個合適的選擇,這有助於確保只有您定義的枚舉類型保存在數據庫中。

PHP:

abstract class STATUS 
{ 
    const pending = 1; 
    const active = 2; 
    const void = 3; 
    const suspended = 4; 

    function GetConstants() 
    { 
     $rc = new ReflectionClass($this); 
     return $rc->getConstants(); 
    } 
} 

C#

public enum CourseType 
{ 
    pending = 1; 
    active = 2; 
    void = 3; 
    suspended = 4; 
} 
相關問題