在数据库中存储枚举值的最佳方法 - String或Int

ini*_*iki 19 database nhibernate enums fluent

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

将这些值存储在数据库中的最佳方法是什么,如String或Int?

仅供参考,我还将使用流畅的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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

KLE*_*KLE 20

在这两种情况下,实施都很容易,性能差异应该很小.

因此,请注意:字符串比数字更有意义,因此请使用字符串.

  • +1我已经处理了数百万条记录.只有这样,我意识到意义比"紧凑"更重要. (7认同)
  • 有时性能更重要,以免失去意义。所以选择你的毒药并确定哪个更有价值。 (3认同)

pyr*_*lus 16

两者都有优势.如果按Integer值存储它们,则必须在项目中稍后编辑枚举.如果以某种方式重新定义了枚举元素的整数值,则所有数据都将被破坏.但它将是最快/最小的数据类型.

如果使用字符串表示形式,只要不更改枚举中元素的名称,就不会出现重新定义的值问题.但是,字符串会占用数据库中更多的空间,并且使用起来可能会花费更多.

最后,我猜没有明确的赢家.

编辑

使用Integer值可能是最好的方法.您可以通过自己设置每个元素的值来克服枚举元素的"重新定义的值"问题.确实是凯文的好建议.

  • 我真的没有看到我建议说实话的地方.我只说明优点和缺点.虽然你有一个观点,不想依赖序数值,你可能想把评论中的"火"降低一个档次;) (14认同)
  • 我不敢相信你甚至会考虑半推荐一种容易导致数据损坏的方法!出于对紧凑性的想象关注?如果紧凑性问题很严重,请在枚举中添加一个int字段!永远不要依赖序数.阅读有效的Java. (2认同)
  • @KevinBourrillion “在枚举中添加一个 int 字段”是什么意思? (2认同)
  • @John 他的意思是为枚举的元素分配特定的值。有关示例,请参阅 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/enumeration-types。那样的话,你就没有机会了。 (2认同)