我们正在使用NHibernate,我们用于存储枚举类信息的常用模式之一是为枚举定义单独的表,并且仅使用枚举对主实体/表中的ID进行引用。一个简单的例子:
Message
-------
ID (bigint PK)
MessageTypeID (bigint FK)
Body (varchar)
MessageType
-----------
ID (bigint PK)
Value (varchar)
MessageType表包含少量枚举值,如:SMS,MMS,PSMS等。
是否值得将枚举值放在这样的单独表中?我想枚举的专家是你可以在将来更容易地扩展它并且它更加规范化,但是你必须在每次获取消息时都进行连接。是否有一个突破点,你会选择一个而不是另一个?
答案 0 :(得分:10)
使用枚举意味着不要像现在这样使用另一个表。正如你所说的那样它也更快,而且更简单。
在这两种情况下,您都可以添加更多选项,但问题是:如果在表中添加其他项,您是否需要重新编译应用程序才能添加此类功能?
我的意思是,如果您的应用程序设计是耦合的并且支持新的消息类型,您需要重新编译(可能因为您需要包含SMS实现),不值得拥有一个单独的表,并且您应该使用枚举
另一方面,如果您的实体缺少逻辑(例如,States或States表),或者您的应用程序可以在不重新编译的情况下插入新的消息类型,则应使用另一个表。为此,您可以将表格更改为:
MessageType
-----------
ID (bigint PK)
Value (varchar)
ImplementationType (varchar) (ie: Xyz.SMSSender, Xyz)
或者您可以拥有一个单独的配置文件,您可以在其中自定义注入的依赖项。
答案 1 :(得分:2)
我会在您的代码中创建一个枚举,其ID与您的MessageType表匹配。然后在你的类上使用它,nHibernate应该能够正确映射它。
我一直偏离枚举表,特别是当数据不需要是托管数据时。您是否会随时添加越来越多的MessageType?