2012-08-11 19 views
1

以下方法可用於設計數據庫表中的狀態相關字段。數據庫設計 - 使用短而不是Varchar - 用於狀態字段

方法01:

  • 使用 'VARCHAR' 作爲一個數據類型。
  • 直接地位將被保存如新,在進步,CLOSED

限制:

  • 搜索字符串表總是需要更多的時間&資源
  • 改變現有的狀態文本(例如:「關閉」到「完成」)需要全表更新

方法02:

  • 創建一個狀態查表
  • 使用狀態表的外鍵的從屬表

侷限:

  • 維護外鍵關係
  • 需要使用JOIN在應用程序中所有相關查詢

方法03:

  • 使用短(或)INT對狀態欄
  • 保持在使用ENUM狀態文本應用程序接口(EJB)

這將解決先前方法的侷限性

限制:

  • 需要映射整數到相關狀態(但仍使用枚舉而不是文本是一個更好的方法)

我覺得第三種方法會更高效在*更快DB索引 *更快搜索由於短(或)int字段(而不是)VARCHAR *當然較少的內存指紋的 方面

請問您能否告知我們在靈活性,維護和性能方面是否存在第三種方法的陷阱?

在此先感謝

回答

2
 
Approach 02 : 

Create a status look-up table 
Use the status table as a foreign key in the dependent tables 
Limitations : 

Maintaining the foreign key relationships 
Need to use JOIN for all the related queries in application 

你只需要使用一個連接,如果你存儲爲外鍵查找表中的值是不是人類可讀,或當只有全文適當。如果你使用一個整數,你總是需要一個連接。但是你可以爲某些表使用人類可讀的代碼。查詢char(1)可能比整數更快。 (這些都不將超快如果你只有三個不同的價值觀和100萬行。)

 
    status_code status 
    -- 
    N    New 
    P    In progress 
    C    Closed 

變「封閉」到「已完成」需要更新只有一行,但我認爲這是一個巧合。

 
Approach 03 : 

Use short (or) int for the status field 
Maintain the status text using ENUM in the application interfaces(EJB) 

我討厭必須維護一個只有整數值的數據庫。

如果您打算在此處存儲整數,則該整數需要是存儲實際上對業務感興趣的值的表的外鍵。並且您的應用程序ENUM也應該通過查詢該表來生成。

2

在我們的應用中,我們已經使用

[enum,VARCHAR(30)]PROCESS TYPES

[String,VARCHAR(1)]PROCESS STATUS

enum看起來像是一個更好的選擇,因爲它在Java代碼中節省String比較。 所以我相信,如果你選擇執行是[enum,NUMERIC]字段,它應該一路走下去......

1

在我們的項目中,我們使用了一種非常類似於#3的方法。在Java方面,我們使用了enum s。我們使用JPA的@Enumerated(EnumType。Ordinal)將枚舉映射到數字,以便保留到數據庫。我們將狀態文本嵌入到枚舉中(請參見下面的示例),但它也可以完全分開。

優點:

  • Java代碼是錯誤遠遠小於只有數字或字符串工作容易。
  • 數據庫部分既是空間又是CPU使用效率。
  • 您可以隨意重命名enum項目(但不重命名或移動,請參閱缺點部分)。

缺點:

  • 在數據庫中的數字是枚舉ordinal numbers。因此,您無法刪除或重新訂購Java代碼中的enum項目。您只能在列表的末尾添加新的。這取決於你的情況,但對我們來說這不是什麼大問題。沒有理由移動枚舉項目的順序。如果我們想刪除一個項目,我們只是將其重命名爲REMOVED_STATUS_XY,以確保代碼不再被使用。

public enum Status { 
    EXAMPLE_STATUS("User status message"), 
    ... ; 

    private Status(String label) { 
     this.label = label; 
    } 
    private final String label; 

    public final String label() { 
     return label; 
    } 
}