Hibernate/NHibernate中的枚举表

Hibernate/NHibernate中的枚举表,nhibernate,hibernate,enums,Nhibernate,Hibernate,Enums,我们使用的是NHibernate,存储类似enum的信息的常见模式之一是为enum定义单独的表,并且只引用使用enum的主实体/表中的ID。一个简单的例子: Message ------- ID (bigint PK) MessageTypeID (bigint FK) Body (varchar) MessageType ----------- ID (bigint PK) Value (varchar) MessageType表包含少量枚举值,如:SMS、MMS、PSMS等 是否值得像这

我们使用的是NHibernate,存储类似enum的信息的常见模式之一是为enum定义单独的表,并且只引用使用enum的主实体/表中的ID。一个简单的例子:

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

MessageType
-----------
ID (bigint PK)
Value (varchar)
MessageType表包含少量枚举值,如:SMS、MMS、PSMS等


是否值得像这样将枚举值放在单独的表中?我想枚举的优点是将来可以更容易地扩展它,而且它更规范化,但缺点是每次获取消息时都必须进行连接。是否存在一个断点,您可以选择其中一个而不是另一个?

我会在代码中创建一个枚举,其ID与MessageType表匹配。然后在你的类上使用它,nHibernate应该能够正确地映射它


我一直在偏离枚举表,尤其是当数据不需要管理时。是否要在运行时添加越来越多的MessageType?

使用枚举意味着不要像现在这样使用另一个表。正如你所说,它也更快,而且更简单

在这两种情况下,您都可以添加更多选项,但问题是:如果在表中添加另一项,您是否需要重新编译应用程序以添加此类功能

我的意思是,如果您的应用程序设计是耦合的,并且为了支持新的消息类型,您需要重新编译(可能是因为您需要包含SMS实现),那么不值得使用单独的表,您应该使用枚举

另一方面,如果您的实体缺少逻辑(例如国家或状态表),或者您的应用程序可以插入新的消息类型而无需重新编译,那么您应该使用另一个表。为此,您可以将表格更改为以下内容:

MessageType
-----------
ID (bigint PK)
Value (varchar)
ImplementationType (varchar) (ie: Xyz.SMSSender, Xyz)
或者您可以有一个单独的配置文件,可以在其中自定义注入的依赖项