【问题标题】:Persisting Enums in database tables在数据库表中持久化枚举
【发布时间】:2010-10-15 00:22:14
【问题描述】:

我有一个具有状态的订单(在代码中是一个枚举)。问题是如何坚持这一点。我可以:

  1. 将字符串保留在字段中,然后在数据检索时映射回枚举。
  2. 将此保留为整数,然后在数据检索时映射回枚举。
  3. 为枚举值创建单独的表并在数据检索时进行连接。

想法?

【问题讨论】:

  • #1 的一个不错的功能是,如果数据库确实与应用程序不同步,至少您知道要存储的值是什么,并且在以下情况下修复数据库很容易枚举的字符串值在 .NET 中已更改。

标签: c# database-design enums


【解决方案1】:

如果这是一个固定列表(看起来确实如此,否则您不应该将其存储为枚举),我不会使用 #1。

使用#3 而不是#2 的主要原因是为了便于使用自助查询实用程序。但是,我实际上会使用 #2 的变体:将值存储为整数并映射到数据检索的枚举。但是,还要创建一个表示枚举类型的表,其中值作为 PK,名称作为另一列。这样,您的代码使用起来简单、快速、高效,而且通过自助查询和其他不使用您的数据访问代码的用途,也很容易获得逻辑值。

【讨论】:

  • +1,我还要设置一个 FK 以确保整数是有效的枚举值。
  • 是的,另外,将其作为 FK 有助于自助查询工具的可发现性。
【解决方案2】:

#3 从数据库/规范化的角度来看是最“合适的”。实际上,您的状态是链接到订单实体的域实体。

【讨论】:

    【解决方案3】:

    hibernate 默认使用整数。 如果您的枚举不会经常更改,我认为这不是一个坏主意。

    【讨论】:

      【解决方案4】:

      我会使用一个整数映射到另一个表中的值和值。 然后,您也可以将枚举映射到相同的值,但是您必须在两个位置都进行更新。

      【讨论】:

        【解决方案5】:

        我想这取决于检索数据的位置。使用#3,您可以在不依赖 .NET 前端的情况下检索数据。但是您的数据库表也有可能与枚举代码不同步。

        选项 #2 无疑是最有效的存储方式……但存储​​成本低廉。

        【讨论】:

          猜你喜欢
          • 2010-10-04
          • 1970-01-01
          • 2011-01-20
          • 1970-01-01
          • 2011-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多