数据库和O / RM中的枚举

时间:2009-08-14 16:27:44

标签: nhibernate database-design orm enums lookup-tables

假设我希望表Regions中的条目具有类型,例如一个城市,一个国家等。假设我将使用O / RM(在我的情况下是NHibernate),这种类型的存储方式是什么?我看到两个选择:

  • 在C#bussines图层中添加包含类型的枚举,并将类型存储为表中的tinyint
  • 拥有一个带有类型标识符(字符串或整数)的查找表RegionTypes,并在Regions表中引用它们。

从数据库的角度来看,第二种方法似乎更合理,因为我有外键约束,而且我可以获得有关区域类型的其他数据,例如:城市是国家的子类型(因为我使用SQL Server 2008空间功能,实际上我需要这些信息用于空间操作)。但是,从C#的角度来看,我基本上必须有一个实体RegionType并且每次我想将它分配到一个区域时从数据库加载它(据我所知NHibernate不允许我如果我将它存储在查找表中,则使类型成为枚举)。这对于这样一个简单的任务来说有点乏味,因为他们知道区域类型基本上是固定的,不太可能改变。

如果其他类型,如DayOfWeek不太可能改变或具有其他属性,那么它们的查找表和实体应该是什么呢?

3 个答案:

答案 0 :(得分:2)

一般规则是使用枚举,如果您确定一组值永远不会被用户更改 。否则最好使用查找表。

答案 1 :(得分:1)

使用查找表的一个原因是在菜单或其他内容中显示可能值的常见用例。查询查询表很容易,但如果枚举在数据库数据类型或约束中硬编码,或者在C#枚举中则不太容易。

答案 2 :(得分:0)

我通常选择后一个选项,但是,我将创建一个通用的设置类型,其中多个类型的项目可以存储在同一个表中,这样我就不会得到15种类型的表格。基础知识是这样的

Types
   TypeID int,
   Name varchar(20),
   Description varchar(100)

Type_Items
   ItemID int,
   TypeID int -> Types.TypeID,
   Name varchar(20),
   Description varchar(100),
   Value varchar(100)