代码之家  ›  专栏  ›  技术社区  ›  Saulius Valatka

数据库和O/RM中的枚举

  •  2
  • Saulius Valatka  · 技术社区  · 15 年前

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

    • 在C#busines层中有一个包含类型的枚举,并将类型存储为 tinyint 在桌子上。
    • RegionTypes 使用类型标识符(字符串或int)并在 区域 桌子

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

    其他类型的呢,比如 DayOfWeek 哪些不太可能更改或具有其他属性,它们是否应该有自己的查找表和实体?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Alex Kofman    15 年前

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

        2
  •  1
  •   Bill Karwin    15 年前

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

        3
  •  0
  •   Spencer Ruport    15 年前

    我通常使用后一个选项,不过,我将创建一种通用的设置,其中多种类型的项可以存储在同一个表中,这样我就不会得到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)