Для своих собственных перечислений используйте числовые значения по одной простой причине: он позволяет использовать каждую часть функциональности enum
из коробки без проблем. Единственное предостережение в том, что в определении enum
каждому члену должно быть явно задано числовое значение, которое может никогда не изменяться (или, по крайней мере, не после того, как вы сделали первый выпуск). Я всегда добавляю заметные комментарии к перечислениям, которые сохраняются в базе данных, чтобы люди не меняли константы.
Вот несколько причин, по которым числовые значения лучше строковых идентификаторов:
- Это самый простой способ представить значение
- Поиск / сортировка в базе данных быстрее
- Более низкая стоимость хранения базы данных (что может быть серьезной проблемой для некоторых приложений)
- Вы можете добавить
[Flags]
к своему enum
и не нарушать свой код и / или существующие данные
- Для
[Flags]
хранится в строковом поле:
- Плохо нормализованные данные
- Может генерировать ложноположительные аномалии при сопоставлении (т. Е. Если у вас есть члены "Sales" и "RetailSales", простой поиск по подстроке "Sales" будет совпадать для любого типа). Это должно быть ограничено либо с помощью регулярного выражения на границах слов (привередливы в использовании баз данных и медленно), либо с помощью ограничения в самом перечислении, которое нестандартно, подвержено ошибкам и очень трудно отлаживается.
- Для строковых полей (либо
[Flags]
, либо нет), если база данных запутана, это поле необходимо обработать, что сильно влияет на возможности и эффективность при выполнении поиска / сортировки кода, как упоминалось в предыдущем пункте
- Вы можете переименовать любого участника, не нарушая код базы данных и / или существующие данные клиента.
- Меньше пространства / времени для передачи данных по проводной связи
Есть только две ситуации, когда использование имен членов в базе данных может быть преимуществом:
- Если вы делаете много редактирования данных вручную ... но кто это делает? И если да, есть большая вероятность, что вы все равно не будете использовать
enum
.
- Сторонние перечисления, где они могут быть не такими прилежными, чтобы поддерживать числовые константы значений. Но я должен сказать, что любой, кто выпускает прилично написанный API, в подавляющем большинстве случаев будет достаточно умен, чтобы поддерживать значения
enum
постоянными. (Идентификаторы должны оставаться неизменными, поскольку их изменение нарушит существующий код.)
На таблицах поиска, которые я категорически не одобряю, потому что это односторонний сверхскоростной пассажирский экспресс до кошмара обслуживания:
- Добавление функциональности
[Flags]
требует использования соединительной таблицы, что означает более сложные запросы (существующие необходимо переписать) и дополнительную сложность. А как насчет существующих данных клиента?
- Если идентификатор хранится в таблице данных, какой смысл иметь таблицу поиска в первую очередь?
- Если числовое значение хранится в таблице данных, вы ничего не получите, так как вам все равно придется искать идентификатор из таблицы поиска. Чтобы сделать это проще, вы можете создать представление ... для каждой таблицы, в которой есть значение
enum
. И тогда давайте даже не будем думать о [Flags]
перечислениях.
- Введение любого вида синхронизации между базой данных и кодом просто вызывает проблемы. А как насчет существующих данных клиента?