【问题标题】:Enumerations in the database and O/RM数据库和 O/RM 中的枚举
【发布时间】:2009-08-14 16:27:43
【问题描述】:

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

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

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

对于其他类型,比如DayOfWeek,它们不太可能永远改变或有额外的属性,他们应该有自己的查找表和实体吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 这将是一个良好且有效的查找/参考系统,但就数据库关系完整性而言完全无效。
        • 您将无法在查找表中设置外键约束,除非完整的主键 (Type + Id) 存在于 both 父和子表。 RDBMS 非常擅长执行关系完整性,我不想失去这种内置功能。
        • @Philip:仍然可以保持一定程度的参照完整性。尽管如此,如果它对您来说很重要,那么在我看来,一个表中的额外字段比额外的 20 或 30 个表更容易维护。
        • 20 或 30 张桌子有什么问题?我知道在 Oracle 中为新表分配空间是一件苦差事,但那是因为它是 1980 年代的恐龙技术。
        • @Bill:如果有必要的话,20 或 30 张桌子没有任何问题。如果没有必要,它们只会使数据库设计更加复杂。
        猜你喜欢
        • 2021-04-09
        • 2018-12-24
        • 2019-10-02
        • 1970-01-01
        • 1970-01-01
        • 2012-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多