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

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

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

MessageType表包含少量枚举值,如:SMS,MMS,PSMS等。

是否值得将枚举值放在这样的单独表中?我想枚举的专家是你可以在将来更容易地扩展它并且它更加规范化,但是你必须在每次获取消息时都进行连接。是否有一个突破点,你会选择一个而不是另一个?

有帮助吗?

解决方案

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

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

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

另一方面,如果您的实体缺少逻辑(例如,States或States表),或者您的应用程序可以在不重新编译的情况下插入新的消息类型,则应使用另一个表。为此,您可以将表格更改为:

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

或者您可以拥有一个单独的配置文件,您可以在其中自定义注入的依赖项。

其他提示

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

我一直偏离枚举表,特别是当数据不需要是托管数据时。您是否会随时添加越来越多的MessageType?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top