【问题标题】:Enum tables in Hibernate/NHibernateHibernate/NHibernate 中的枚举表
【发布时间】:2009-03-03 02:41:45
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: nhibernate hibernate enums


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      我一直偏离枚举表,尤其是当这些数据不需要是托管数据时。您是否会在执行过程中添加越来越多的 MessageType?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        • 1970-01-01
        • 2012-02-14
        • 2011-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多