在数据库中存储枚举值的最佳方式是什么 - 字符串还是整数?

34

我的应用程序中有许多枚举类型,在某些类中用作属性类型。

将这些值存储在数据库中的最佳方式是字符串还是整数?

值得一提的是,我还将使用流畅的Nhibernate映射这些属性类型。

示例代码:

public enum ReportOutputFormat
{
    DOCX,
    PDF,
    HTML
}

public enum ReportOutputMethod
{
    Save,
    Email,
    SaveAndEmail
}

public class ReportRequest
{
    public Int32 TemplateId
    {
        get { return templateId; }
        set { templateId = value; }
    }
    public ReportOutputFormat OutputFormat
    {
        get { return outputFormat; }
        set { outputFormat = value; }
    }

    public ReportOutputMethod OutputMethod
    {
        get { return outputMethod; }
        set { outputMethod = value; }
    }
}
2个回答

44

两种情况下实现都很容易,性能差异应该很小。

因此,选择意义更加明确的字符串而不是数字,所以使用字符串。


20
我曾经处理过数百万条记录,只有在那之后我才意识到,意义比“紧凑性”更为重要。 - Sarmaad
4
有时候,性能更重要,以免失去意义。因此,请选择你的偏好并确定哪个更有价值。 - Suncat2000

27

两者都有优劣之处。如果您按其整数值存储它们,那么在项目后期编辑枚举时必须小心。如果枚举元素的整数值以某种方式被重新定义,那么所有数据都将损坏。但这将是使用最快/最小的数据类型。

如果您使用字符串表示形式,则只要不更改枚举元素的名称,就不会出现重新定义值的问题。但字符串会占用更多数据库空间,并且在使用中可能会稍微更加昂贵。

最终,我想没有明确的获胜者。

编辑

使用整数值可能是最佳方法。您可以通过为每个元素设置值来克服枚举元素的“重新定义值”问题。这确实是Kevin提出的好建议。


4
我简直不敢相信你会考虑半推荐这种方法,这种方法很容易导致数据损坏!只是因为对紧凑性的想象?如果紧凑性的问题如此严重,可以在枚举中添加一个 int 字段!永远不要依赖于序数。请阅读《Effective Java》。 - Kevin Bourrillion
25
实话实说,我并没有推荐任何东西。我只是陈述了优点和缺点。不过你说得对,不想依赖顺序值,你可能需要降低评论中的那种“火气” ;) - pyrocumulus
3
@KevinBourrillion “向枚举添加一个int字段”是什么意思? - John
4
他的意思是为枚举类型的元素指定具体的值。请参阅https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/enumeration-types了解示例。这样可以确保不留任何机会。 - pyrocumulus

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