何时应该在数据库中存储枚举,何时应该在代码中使用枚举?

3
什么是存储枚举的最佳方法? 例如,我有一个实体Person,其中包含一个属性Sex。我能想到的第一种选择是创建一个表来存储枚举值和名称(例如1表示男性,2表示女性),然后在Person表中存储int值。第二种选择是在代码中使用枚举和相应的int值,并在Person表中存储int值。最后一种选择是再次在代码中使用枚举并存储字符串值。例如,带有性别“男”的人。
哪种方法更好,何时使用?
7个回答

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 }

何时仅在代码中使用枚举?
比如说,当需要进行位掩码操作时。这样你就可以将一些只在应用程序中有意义的设置高效地存储在数据库中。数据完整性并不重要,因为数据库与此无关。


1
对于这个特定的例子,性别将始终是男性或女性,因此使数据库承载这种静态细节并不是非常有益的。
但是有一些枚举更具动态性,比如一个带有 Visa 和 Mastercard 枚举的商店。也许以后他们将不得不添加 Discover 和 Amex,此时数据库枚举更有用,因为您在代码中也可以动态处理它。

1

第三个选项(存储字符串值)是最差的:您需要在字符串和枚举之间进行转换。将枚举作为int存储更好,因为枚举本质上就是int,所以来回转换很便宜。

是否在数据库中存储查找取决于您在数据库中想要做什么:对该表进行外键引用将确保您仅存储正确的值。但是,您也可以决定您的程序始终会存储正确的值,因为这来自于您的枚举。


1

我会同时使用两种方法。你应该在数据库中设置约束条件,以便无法输入任何无效值。如果不这样做,你将能够从程序或任何其他(未来可能使用相同数据库的)程序中插入无效值。

确实可以使用包含所有性别的表,因为这将允许外键约束,从而强制执行正确的数据。此外,你还可以轻松地扩展表格以添加额外的值,尽管在性别方面可能没有那么有用。

但是,我也可以理解如果有人想将其作为一个字符(1)字段,其中可以包含M、F和可能代表未知、无、两者都有的其他值(取决于存储在数据库中的物种)。

但是,在此之后,创建代码中的枚举仍然很方便,你可以使用它来轻松地转换这些数据库值。如果你实际上指的是“女性”,你不想在表达式中使用值“2”,因此你将想要使用枚举或至少一些常量,这些常量直接或间接地映射到数据库中的实际值(因为抽象是数据库开发的关键)。


1

你应该同时使用它们,但它们应该存储在数据库中。如果你正在使用 Visual Studio,你可以创建一个自定义的 T4(文本模板转换工具包)模板(.tt 文件)。这将允许你直接从数据库中存储的内容创建类/枚举。你将获得右键单击 tt 文件、选择“运行自定义工具”并从数据库中存储的内容更新 c# 文件的能力。


0

如果有可能数据将被其他应用程序、报告系统等使用,那么请将数据存储在数据库中。


0

如果正确使用约束条件,数据库枚举肯定更有用。

Person
Name   |Age   |Gender |FK_Country_ID|
-------|------|-------|-------------|
varchar|int   |bit    |int          |

Country
CountryID|Country|
---------|-------|
int      |varchar|

Person 0.* ----- 1 Country

一个外键约束将确保在数据库中插入或更新数据时数据的有效性。硬编码的枚举将迫使您稍后重新编译代码。最好的做法是读取外键的值并提供动态查找。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接