Лучший способ хранить значения перечисления в базе данных - String или Int

В моем приложении есть несколько перечислений, которые используются как тип свойства в некоторых классах.

Как лучше всего хранить эти значения в базе данных в виде 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; }
    }
}

person inutan    schedule 23.10.2009    source источник


Ответы (2)


У обоих есть преимущества. Если вы сохраняете их по целочисленному значению, вы должны быть осторожны, редактируя перечисление позже в своем проекте. Если каким-то образом целочисленные значения для элементов перечисления будут переопределены, все ваши данные будут повреждены. Но это будет самый быстрый / наименьший тип данных для использования.

Если вы используете строковое представление, у вас не будет проблемы с переопределенным значением до тех пор, пока вы не измените имена элементов в перечислении. Однако строки занимают больше места в вашей базе данных и, вероятно, немного дороже в использовании.

В конце концов, я полагаю, что окончательного победителя нет.

Изменить

Лучше всего использовать целочисленное значение. Вы можете преодолеть проблему «переопределения значения» для элементов перечисления, установив значение для каждого элемента самостоятельно. Действительно хорошее предложение от Кевина.

person pyrocumulus    schedule 23.10.2009
comment
Не могу поверить, что вы даже наполовину рекомендовали подход, который легко может привести к повреждению данных! Просто из воображаемой заботы о компактности? Если проблема компактности настолько велика, добавьте в перечисление поле типа int! НИКОГДА не полагайтесь на порядковый номер. Прочтите «Эффективная Java». - person Kevin Bourrillion; 18.03.2010
comment
Я действительно не вижу, где я что-то рекомендую, если честно. Я лишь констатирую достоинства и недостатки. Хотя вы правы, не желая полагаться на порядковый номер, вы, возможно, захотите убрать этот «огонь» в своем комментарии на ступеньку ниже;) - person pyrocumulus; 25.03.2010
comment
@KevinBourrillion Что означает добавление поля int к перечислению? - person John; 08.12.2017
comment
@John он имеет в виду присвоение определенных значений элементам перечисления. См. docs.microsoft.com/en-us/dotnet / csharp / programming-guide / для примеров. Таким образом, вы ничего не оставляете на волю случая. - person pyrocumulus; 14.12.2017

Реализация проста в обоих случаях, и разница в производительности должна быть незначительной.

Поэтому ищите значение: Строки более значимы, чем числа, поэтому используйте Строку.

person KLE    schedule 23.10.2009
comment
+1 Я работал с миллионами записей. Только тогда я понял, что смысл намного важнее компактности. - person Sarmaad; 13.12.2010
comment
Иногда производительность важнее, чтобы не потерять смысл. Так что выберите свой яд и определите, какой из них имеет большую ценность. - person Suncat2000; 12.10.2017