2009-09-07 22 views
1

我無法對此做出明確的決定。將枚舉作爲字節或文本持久化到數據庫中

通過在我的表上使用數字值並獲得DBA數據庫上列的描述的值信息,我可以。

但是我也不想在將來的數據庫上使用這些數字值來創建維護過於頭痛的問題。

我並不特別喜歡在數據庫上使用這些枚舉列的字符串,因爲它會在數據庫上創建大量重複的字符串重複。這可能不是一個主要的性能問題,但我認爲不適合在桌子上放置很多字符串來表示價值。

請您分享您的想法,從您的長期經驗。謝謝

+0

似乎像這個問題剛剛問幾個小時前(和答案):http://stackoverflow.com/questions/1390697/sql-table-and-c-enumeration Marc – 2009-09-07 21:21:54

回答

7

處理您的情況的標準方法是通過查找表。一般情況下,這些具有結構簡單(往往只是兩列):

CREATE TABLE LookupTable 
(
    code SMALLINT NOT NULL PRIMARY KEY, 
    name VARCHAR(32) NOT NULL 
); 

你可能會或可能不會進行名稱列的唯一了。然後,對於包含相關類型的值的表,你可以使用:

CREATE TABLE ReferencingTable 
(
    ... 
    lookup SMALLINT NOT NULL REFERENCES LookupTable, 
    ... 
); 

這裏,我不是很聰明與名稱;您可以使用'CustomerStatus'代替'LookupTable',然後在ReferencingTable中使用列名CustStatus。您可以爲「代碼」列選擇各種類型 - 單個字節微小整數,小型CHAR字段或INTEGER,具體取決於您可能需要的值。有時,查找表變得更加複雜,並且也獲取了描述實體的額外屬性,儘管這通常意味着它正在建模一個對您的數據庫有重要意義的實體,並且它不再是「查找表」。

你可以用相當多的這些查找表來結束,但要抵制陷入「一個真正的查找表」(OTLT)習慣用法陷阱的誘惑。正如其他SO問題和Web上其他地方所記錄的,這會導致數據完整性問題。

+0

LookupTable可能是一個「LookupSTable」與一個「EnumName」字段。 – Burnsys 2009-09-19 05:48:13

相關問題