哪种方法更好,何时使用?
代码中的枚举非常棒和方便,但是当修改枚举时可能会破坏数据库的完整性。
因此,在需要关系完整性的情况下,请在数据库中使用枚举。我们在代码中使用显式映射的枚举来处理这个问题,并在数据库中强制执行完整性,如下所示:
| 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 }
何时仅在代码中使用枚举?
比如说,当需要进行位掩码操作时。这样你就可以将一些只在应用程序中有意义的设置高效地存储在数据库中。数据完整性并不重要,因为数据库与此无关。
第三个选项(存储字符串值)是最差的:您需要在字符串和枚举之间进行转换。将枚举作为int存储更好,因为枚举本质上就是int,所以来回转换很便宜。
是否在数据库中存储查找取决于您在数据库中想要做什么:对该表进行外键引用将确保您仅存储正确的值。但是,您也可以决定您的程序始终会存储正确的值,因为这来自于您的枚举。
我会同时使用两种方法。你应该在数据库中设置约束条件,以便无法输入任何无效值。如果不这样做,你将能够从程序或任何其他(未来可能使用相同数据库的)程序中插入无效值。
确实可以使用包含所有性别的表,因为这将允许外键约束,从而强制执行正确的数据。此外,你还可以轻松地扩展表格以添加额外的值,尽管在性别方面可能没有那么有用。
但是,我也可以理解如果有人想将其作为一个字符(1)字段,其中可以包含M、F和可能代表未知、无、两者都有的其他值(取决于存储在数据库中的物种)。
但是,在此之后,创建代码中的枚举仍然很方便,你可以使用它来轻松地转换这些数据库值。如果你实际上指的是“女性”,你不想在表达式中使用值“2”,因此你将想要使用枚举或至少一些常量,这些常量直接或间接地映射到数据库中的实际值(因为抽象是数据库开发的关键)。
你应该同时使用它们,但它们应该存储在数据库中。如果你正在使用 Visual Studio,你可以创建一个自定义的 T4(文本模板转换工具包)模板(.tt 文件)。这将允许你直接从数据库中存储的内容创建类/枚举。你将获得右键单击 tt 文件、选择“运行自定义工具”并从数据库中存储的内容更新 c# 文件的能力。
如果有可能数据将被其他应用程序、报告系统等使用,那么请将数据存储在数据库中。
如果正确使用约束条件,数据库枚举肯定更有用。
Person
Name |Age |Gender |FK_Country_ID|
-------|------|-------|-------------|
varchar|int |bit |int |
Country
CountryID|Country|
---------|-------|
int |varchar|
Person 0.* ----- 1 Country