代码之家  ›  专栏  ›  技术社区  ›  Thea Ray Suelzer

什么时候应该使用存储在数据库中的枚举,什么时候在代码中使用枚举?

c#
  •  3
  • Thea Ray Suelzer  · 技术社区  · 15 年前

    存储枚举的最佳方法是什么? 例如,我有一个有财产性的实体人。我能想到的第一个选项是存储枚举值和名称的表(例如1代表男性,2代表女性),然后在Person表中存储int值。第二个选项是在代码中使用带有相应int值的枚举,并将int值存储在Person表中。最后一个选项是在代码中再次使用枚举并存储字符串值。例如,性行为“男性”的人。

    哪种方法更好?什么时候?

    7 回复  |  直到 15 年前
        1
  •  5
  •   Jan Jongboom    15 年前

    代码中的枚举很酷也很方便,但是在更改枚举时可能会破坏数据库的完整性。

    所以一般来说:当需要关系完整性时,在数据库中使用枚举。我们在代码中使用显式映射枚举来处理此问题;并在数据库中强制实现完整性。比如:

    | 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.比特蒙版!因此,您可以将只有在应用程序中才有意义的设置有效地存储在数据库中。完整性并不重要,因为数据库与此无关。

        2
  •  1
  •   BeemerGuy    15 年前

    对于这个特定的例子,性别总是男性或女性,所以让数据库携带静态细节并不是非常有益。

    但也有一些枚举更具动态性,比如有枚举Visa和Mastercard的商店。可能稍后他们将不得不添加Discover和Amex,在这一点上,数据库枚举更有用,因为您也可以在代码中动态处理它。

        3
  •  1
  •   Hans Kesting    15 年前

    第三个选项(存储字符串值)最糟糕:然后需要在字符串和枚举之间进行转换。将枚举存储为int更好,因为枚举基本上是int本身,所以来回转换很便宜。

    是否将查找存储在数据库中取决于要在数据库中执行的操作:对该表具有外键引用将确保只存储正确的值。但您也可以决定您的程序将始终存储正确的值,因为该值来自您的枚举。

        4
  •  1
  •   GolezTrol    15 年前

    我会两者都用。您应该以任何方式对数据库设置约束,以便不能输入任何无效值。如果不这样做,则可以从程序或其他可能使用同一数据库的(将来的)程序中插入无效值。

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

    但我也可以理解,如果有人想把它变成一个字符(1)字段,它可以包含M,F,或者其他一些值,表示未知,无,两者(取决于数据库中存储的物种)。

    但在这之后,在代码中创建枚举可能仍然很方便,您可以使用它轻松地转换这些数据库值。如果您实际上是指“female”,则不希望在expression中使用值“2”,因此您将希望使用枚举或至少一些常量,这些常量直接或间接映射到数据库中的实际值,因为抽象是数据库开发的关键。

        5
  •  1
  •   brianc    15 年前

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

        6
  •  0
  •   Kell    15 年前

    如果其他应用程序、报表系统等可能需要这些数据,请将这些数据存储在数据库中。

        7
  •  0
  •   user295190user295190    15 年前

    如果正确使用约束,数据库枚举无疑更有用。

    Person
    Name   |Age   |Gender |FK_Country_ID|
    -------|------|-------|-------------|
    varchar|int   |bit    |int          |
    
    Country
    CountryID|Country|
    ---------|-------|
    int      |varchar|
    
    Person 0.* ----- 1 Country
    

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