何时在关系数据库中使用枚举或小表?

时间:2014-07-10 15:38:53

标签: sql database enums

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

我应该创建枚举类型,只要这些实体的名称不重要吗?

4 个答案:

答案 0 :(得分:11)

讨厌用问题回答问题,但这取决于。您经常期望值发生变化,以及您多久发布一次代码?

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

对于不频繁的版本,或者如果您经常有新的/删除/更改的值,请使用数据库表。对于静态值集,或者如果您始终释放代码,请使用枚举。

答案 1 :(得分:9)

Enum在以下情况下很好:

  • 您希望限制可能值的选择(例如,星期几,性别(男/女)) )
  • 您希望减少存储空间(元组每个只存储一个字节)
  • 减少连接的光盘访问次数

在以下情况下,Enum很糟糕:

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

答案 2 :(得分:1)

出于性能方面的考虑,枚举可能会很好,因为字符串比uint包含的数据更多。通常,只要您确定不会更改枚举映射,这就是一个好方法,特别是从编码人员的角度来看。但是,当您想在数据库本身中运行原始sql时,它的确会有点麻烦,因为您需要引用代码来查找所有整数的含义。

答案 3 :(得分:0)

另一种策略是拥有一个同步枚举。编写将表与枚举同步的代码相对来说比较琐碎。在这种情况下,您不仅可以受益于代码,而且可以在数据库表中获得可用数据。

在表中存储数据时可能很重要的一个示例是您有多种访问数据库的方式。例如,您可能有一个单独的业务报告应用程序,可以直接从数据库中提取数据。如果仅运行枚举,则数据库将仅包含整数,而没有说明该值的含义或可接受的值范围(用于查询)。

要同步的代码可能类似于以下内容(我在这里使用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();
                }
            }