使用我自己的枚举类型在数据库中建模类

时间:2009-10-04 05:49:46

标签: c# database sqlite data-modeling enums

我有一个应用程序需要查询lifetables(用于保险计算)。 我正在考虑使用XML来存储数据,但认为它有点大,但使用完整的数据库可能有点小。所以我选择使用SQLite。

在我的应用程序中,我有枚举定义了一些不同的东西。例如,GENDER.Male,GENDER.Female。和JOBTYPE.BlueCollar,JOBTYPE.WhiteCollar。等等。

我有一些看起来像这样的方法:(示例)

FindLifeExpectancy(int age, GENDER gender);
FindDeathRate(int age, JOBTYPE jobType);

所以我的问题是:你如何在数据库中建模枚举?我不认为在数据库中使用0或1来存储JOBTYPE是最佳做法,因为对于任何查看它的人来说都没有意义。但如果您使用nvarchar来存储“BlueCollar”,则会有大量重复数据。

我认为GENDER或JOBTYPE不应该有整个类,或者因为它们提供的信息很少而成为实体模型的一部分。

这通常是怎么做的?

感谢。

3 个答案:

答案 0 :(得分:1)

我更喜欢将程序中的枚举静态映射到数据库中的查找表。我很少使用查找表来进行连接。作为一个例子,我可能有以下表格:

Gender
GenderID  Name
1         Male
2         Female

Accounts
AccountID  GenderID  FirstName  LastName
1          1         Andrew     Siemer
2          2         Jessica    Siemer

然后在代码中,我将使用适当的映射

定义我的枚举
public enum Gender
{
    Male = 1,
    Female = 2
}

然后我可以在代码中使用我的枚举,当我需要在LINQ to SQL查询中使用枚举时,我只需得到它的物理值

int genderValue = (int)Enum.Parse(typeof(Gender), Gender.Male));

这个方法可能会让一些人在那里有点奇怪,但是你已经将代码与数据库中的值相结合了!但是这种方法使得处理代码和支持代码的数据变得更加容易。一般来说,如果有人交换了查找表的ID,那么你将以某种方式被冲洗,因为它是如何映射到你的数据库中的!我更喜欢这种设计的可读性和无处不在的性质。

答案 1 :(得分:0)

虽然你不太可能会添加新的性别,但我不会对jobtype enum这么肯定。我已经为两者使用了一个单独的表,并且每个我需要引用它的地方都有这个表的外键。模式是可扩展的,数据库将自动检查只有可能的值保存在引用表中。

答案 2 :(得分:0)

“enums”的SQL等价物是查找表。这些是包含两个(有时更多)列的表:

  • 代码,通常为短,数字或字符(例如:'R','S','M'...)
  • 文字定义(例如:'退休','学生','军事'......)
  • 额外列可用于存储定义或文本的替代版本,例如柱状报告的简短缩写)

短代码是存储在数据库中的值的类型,避免了您提到的复制。对于相对已建立的类别(比如男/女),您可以使用代码,而无需在查找表中“记录”它。

如果你有很多不同的代码,最好将它们的查找保存在一个SQL表中,而不是增加十几个表。您只需添加一个“类别”列,它本身就是一个代码,指定此类别中定义的代码组的性质(“婚姻状况”,“就业”,“教育”......)

查找表中的信息可用于填充下拉列表等,在UI中,最终用户可以看到明文但应用程序可以使用代码查询数据库。它也用于反向,为数据库中的代码生成明文,用于显示结果列表等。

SQL级别的 JOIN构造是查找表和主表关联的便捷方式。例如:

SELECT Name, Dob, M.MaritalStatus
FROM tblCustomers C
LEFT OUTER JOIN tblMaritalLkup M ON C.MStatus = M.Code
WHERE ...