存储枚举的最佳方法是什么? 例如,我有一个具有属性Sex的实体Person。我能想到的第一个选项是存储枚举值和名称的表(例如,1表示Male,2表示Female),然后在Person表中存储int值。第二个选项是在代码中使用相应的int值进行枚举,并在Person表中存储int值。最后一个选项是在代码中再次枚举并存储字符串值。例如,性别为“男性”的人。
哪种方法更好,什么时候?
答案 0 :(得分:5)
代码中的枚举很酷且很方便,但是在更改枚举时可能会破坏数据库的完整性。
一般来说:当需要关系完整性时,在数据库中使用枚举。我们在代码中使用显式映射枚举来处理这个问题;并在数据库中强制执行完整性。像:
| Id | Value |
---------------
| 1 | Male |
| 2 | Female |
// FK from the table above to the table containing all your data, and in code:
enum Gender { Male = 1, Female = 2 }
何时仅在代码中使用枚举?
F.E. Bitmasking!因此,您可以在数据库中有效地存储一组只在您的应用程序中有意义的设置。诚信并不关心,因为数据库与此没有任何关系。
答案 1 :(得分:1)
对于这个特殊的例子,性别总是男性或女性,所以使数据库携带静态细节并不是非常有益。
但是有一些枚举更具活力,就像一个包含Visa和Mastercard枚举的商店。可能稍后他们将不得不添加Discover和Amex,此时数据库枚举更有用,因为您也可以动态地处理它。
答案 2 :(得分:1)
第三个选项(存储字符串值)是最差的:然后你需要在字符串和枚举之间进行转换。将枚举存储为int更好,因为枚举本身基本上是一个int,因此来回转换是便宜的。
是否在数据库中存储查找取决于您要在数据库中执行的操作:对该表的外键引用将确保您只存储正确的值。但是你也可以决定你的程序将始终存储一个正确的值,因为它来自你的枚举。
答案 3 :(得分:1)
我会同时使用两者。您应该以任何方式对数据库设置约束,以便您不能输入任何无效值。如果不这样做,您将能够从程序或可能使用同一数据库的任何其他(未来)程序中插入无效值。
您确实可以使用包含所有性别的表,因为这将允许外键约束,从而强制执行正确的数据。此外,您可以使用额外的值轻松扩展表格,但在性别情况下这可能没有那么有用。
但是我也可以理解是否有人想让它成为一个字符(1)字段,它可以包含M,F和其他一些代表未知,无,两者的值(取决于存储在数据库中的物种)。
但在此之后,在代码中创建枚举可能仍然很方便,您可以使用它来轻松转换这些数据库值。如果你实际上意味着'女性',你不会想要在一个探索中使用值'2',所以你会想要使用枚举或至少一些映射 - 直接或间接的常量,因为抽象是数据库中的关键开发 - 到数据库中的实际值。
答案 4 :(得分:1)
您应该同时使用它们,但它们应该存储在数据库中。如果您使用的是Visual Studio,则可以创建自定义T4(文本模板转换工具包)模板(.tt文件)。这将允许您直接从存储在数据库中的内容创建类/枚举。您将能够右键单击该tt文件,选择“运行自定义工具”并根据存储在数据库中的内容更新c#文件。
答案 5 :(得分:0)
如果某些其他应用程序,报告系统等有可能需要数据,请将数据存储在数据库中。
答案 6 :(得分:0)
如果正确使用约束,数据库枚举肯定会更有用。
Person
Name |Age |Gender |FK_Country_ID|
-------|------|-------|-------------|
varchar|int |bit |int |
Country
CountryID|Country|
---------|-------|
int |varchar|
Person 0.* ----- 1 Country
外键约束将确保您的数据在数据库中插入或更新时有效。硬编码枚举将强制您稍后重新编译代码。最好是读取外键的值并提供动态查找。