Собственно, такая задача. У объекта есть свойство, имеющее тип перечисления. Каким образом сохранять значение этого свойства в БД?
Навскидку видится 3 варианта разрешения проблемы:
- Сохранять в базе строковое значение элемента enum'а. В этом случае могут возникнуть проблемы, если в будущем элемент будет переименован. В базе останутся старые строковые представления.
- Сохранять целочисленное значение элемента enum'а. В этом случае проблемы возникают если в enum добавляется новый элемент, но ему присваивается значение одного из существующих (т.е. новый добавляется между двумя существующими).
- Отказаться от использования enum'а. Вместо него использовать объект с единственным свойством типа string. В отдельной таблице в базе хранить возможные значения и ссылаться на них из других таблиц. Наверное, такой способ наиболее удачен с точки зрения сохраняемости, но взамен теряются все преимущества использования перечислений в коде.
Как видно, у каждого из способов существуют свои недостатки. Может быть существуют более удачные решения?
Допустим есть такое перечисление:
Вдруг появилась необходимость добавить еще два уровня — Lower и Higher. Будет нелогично добавлять их со значениями 4 и 5. Логичнее будет сделать так:
Представим что у нас в БД есть справочник:
А потом мы решим добавить еще два элемента и поменять ID у существующих... к чему это приведет понятно? Получается, что хранение упорядоченного списка значений в виде enum - не самое лучшее решение...
Еще, как вариант, реализовать enum следующим образом:
Согласен, тоже путаница получается. А что если так:
Добавили еще 2 элемента и изменили порядок:
Для справочника в БД это как раз нормальное решение, а вот реализовать такое с помощью enum будет достаточно проблематично... Разве что с помощью атрибутов.
Да-да, этот вариант (как я уже указал в вопросе) предполагает отказ от использования enum'а.