2009-03-03 60 views
5

我們使用的是NHibernate,我們用來存儲枚舉類信息的常見模式之一是爲枚舉定義單獨的表,並且只需在主實體/表使用枚舉。一個簡單的例子:Hibernate/NHibernate中的枚舉表

Message 
------- 
ID (bigint PK) 
MessageTypeID (bigint FK) 
Body (varchar) 

MessageType 
----------- 
ID (bigint PK) 
Value (varchar) 

的消息類型表包含少量的像枚舉值:SMS,MMS,PSMS等

是否值得投入枚舉值在這樣不同的表?我猜這個枚舉的贊成是你可以在將來更容易地擴展它,並且它更加規範化,但是確保每次獲取消息時都必須進行加入。有沒有突破點,你會選擇一個在另一個之上?

回答

10

使用枚舉意味着不要使用其他表,因爲您現在正在使用其他表。你說的也更快,而且更簡單。

在這兩種情況下,您都可以添加更多選項,但問題是:如果在表中添加另一項,是否需要重新編譯應用程序以添加此功能?

我的意思是,如果你的應用程序設計被耦合並且支持一種新的消息類型,你需要重新編譯(也許因爲你需要包含SMS實現),這是不值得擁有一個單獨的表,你應該使用另一方面,如果您的實體缺乏邏輯(例如Countries或States表),或者您的應用程序可以在不重新編譯的情況下插入新的消息類型,則應使用其他表。對於這一點,你可以在你的表更改爲按這樣的事情:

MessageType 
----------- 
ID (bigint PK) 
Value (varchar) 
ImplementationType (varchar) (ie: Xyz.SMSSender, Xyz) 

或者你可以有一個分離的配置文件,在這裏你可以自定義注入的依賴關係。

2

我會在代碼中爲您的MessageType表創建一個具有匹配ID的枚舉。然後在你的類上使用它,nHibernate應該能夠正確映射它。

我一直在偏離枚舉表,特別是當數據不需要被管理的數據。你會不會添加越來越多的MessageType?