我有一个应用程序需要查询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不应该有整个类,或者因为它们提供的信息很少而成为实体模型的一部分。
这通常是怎么做的?
感谢。
答案 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等价物是查找表。这些是包含两个(有时更多)列的表:
短代码是存储在数据库中的值的类型,避免了您提到的复制。对于相对已建立的类别(比如男/女),您可以使用代码,而无需在查找表中“记录”它。
如果你有很多不同的代码,最好将它们的查找保存在一个SQL表中,而不是增加十几个表。您只需添加一个“类别”列,它本身就是一个代码,指定此类别中定义的代码组的性质(“婚姻状况”,“就业”,“教育”......)
查找表中的信息可用于填充下拉列表等,在UI中,最终用户可以看到明文但应用程序可以使用代码查询数据库。它也用于反向,为数据库中的代码生成明文,用于显示结果列表等。
SQL级别的 JOIN构造是查找表和主表关联的便捷方式。例如:
SELECT Name, Dob, M.MaritalStatus
FROM tblCustomers C
LEFT OUTER JOIN tblMaritalLkup M ON C.MStatus = M.Code
WHERE ...