【问题标题】:When to use an enum or a small table in a relational database?何时在关系数据库中使用枚举或小表?
【发布时间】:2014-07-10 15:38:52
【问题描述】:

我的数据库中有几个小实体,我将它们表示为具有两列的小表:id 和 name。此类实体的示例:国家、大陆。

每当这些实体的名称无关紧要时,我是否应该创建一个枚举类型?

【问题讨论】:

  • 使用枚举而不是类型有什么好处?最大的缺点是,如果 ID 更改或添加了新项目,客户端必须重新编译。
  • 这很好,但是,什么时候在小表上使用枚举呢?当我对数据库进行建模时,我的担忧就开始了,到处都看到了所有这些小表格,并认为使用枚举会使图表看起来更简单。
  • 大陆变化不是很频繁:)

标签: sql database enums


【解决方案1】:

讨厌用问题来回答问题,但这取决于。您期望值多久更改一次,以及您多久发布一次代码?

枚举类型需要更改代码。一个纯数据库表将更容易更改。枚举类型更便于编码。

对于不经常发布的版本,或者如果您经常有新的/删除的/更改的值,请使用数据库表。对于静态值集,或者如果您一直发布代码,请使用枚举。

【讨论】:

  • 问题:就性能而言,枚举更好?
【解决方案2】:

另一种策略是使用同步枚举。编写将表同步到枚举的代码相对简单。在这种情况下,您可以获得代码的好处,同时也可以在数据库表中获得数据。

表中的数据可能很重要的一个示例是,您可以通过多种方式访问​​数据库。例如,您可能有一个单独的业务报告应用程序,可以直接从数据库中提取数据。如果您只运行枚举,那么数据库将只包含整数,而没有解释值的含义或可接受的值范围(用于查询)。

要同步的代码可能如下所示(我这里使用的是 ORM,但原理应该很清楚)。我的代码只处理附加情况——其他情况可能需要编辑甚至删除数据库的枚举。为了获得更多控制,您可以在枚举键上添加一个属性,以将不同的文本记录为数据库中的描述。

            foreach (ApprovalCategoryEnum category in Enum.GetValues(typeof(ApprovalCategoryEnum)))
            {
                ApprovalCategory asc = existingCategories.FirstOrDefault(x => x.ApprovalCategoryId == (int)category);
                if (asc == null)
                {
                    ApprovalCategory newCategory = new ApprovalCategory(session);
                    newCategory.ApprovalCategoryId = (int)category;
                    newCategory.Description = category.ToString().Replace("_", " ");
                    newCategory.Save();
                }
            }

【讨论】:

    【解决方案3】:

    枚举适用于:

    • 您想限制可能值的选择,例如星期几、性别、工单状态(打开/关闭/存档)
    • 您想减少存储空间(每个元组仅存储 1 个字节)
    • 减少连接的磁盘访问次数

    枚举在以下情况下是错误的:

    • 您不确定将什么作为可能的值
    • 可能的值可能会发生变化(这需要 ALTER 表的管理员权限,这可能需要您离线)

    【讨论】:

      【解决方案4】:

      由于字符串包含的数据比 uint 多,因此枚举可能对性能有好处。一般来说,只要您确定不会更改枚举映射,这是一个很好的方法,尤其是从编码人员的角度来看。但是,当您想在数据库本身中运行原始 sql 时,它确实会变得有点麻烦,因为您需要参考代码来查找所有整数的含义。

      【讨论】:

      • 这里的重点是关于直接数据库访问的可能性。当然,您可以编写 API,但如果您不这样做,对枚举引用的查询将只是一个无信息的 int,不会提供有关值的含义或其可用值范围的信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 2015-08-11
      • 2010-10-15
      • 1970-01-01
      相关资源
      最近更新 更多