Таблицы перечисления в режиме гибернации /NHibernate

StackOverflow https://stackoverflow.com/questions/604907

  •  03-07-2019
  •  | 
  •  

Вопрос

Мы используем NHibernate, и одним из распространенных шаблонов, которые у нас есть для хранения информации, подобной перечислению, является определение отдельных таблиц для перечисления и просто создание ссылки на идентификатор в основной сущности / таблице, которая использует перечисление.Простой пример:

Message
-------
ID (bigint PK)
MessageTypeID (bigint FK)
Body (varchar)

MessageType
-----------
ID (bigint PK)
Value (varchar)

Таблица MessageType содержит небольшое количество перечисляемых значений, таких как:SMS, MMS, PSMS и т.д.

Стоит ли помещать значения enum в отдельные таблицы, подобные этой?Я думаю, плюсом перечисления является то, что вы можете легче расширить его в будущем и оно более нормализовано, но минусом является то, что вам приходится выполнять объединение каждый раз, когда вы получаете сообщение.Есть ли переломный момент, когда вы предпочли бы одно другому?

Это было полезно?

Решение

Использование перечислений подразумевает, что вы не должны использовать другую таблицу, как вы делаете прямо сейчас.Это также быстрее, как вы сказали, и намного проще.

В обоих случаях вы можете добавить дополнительные параметры, но вопрос в том,:если вы добавите еще один элемент в таблицу, потребуется ли вам перекомпилировать приложение, чтобы добавить такую функцию?

Я имею в виду, если дизайн вашего приложения сопряжен и для поддержки нового типа сообщений вам нужно перекомпилировать (возможно, потому, что вам нужно включить реализацию SMS), не стоит создавать отдельную таблицу, и вам следует использовать перечисления

С другой стороны, если либо вашей сущности не хватает логики (например, таблицы Countries или States), либо ваше приложение может подключить новый тип сообщения без перекомпиляции, вам следует использовать другую таблицу.Для этого вы могли бы изменить свою таблицу на что-то вроде этого:

MessageType
-----------
ID (bigint PK)
Value (varchar)
ImplementationType (varchar) (ie: Xyz.SMSSender, Xyz)

Или у вас мог бы быть отдельный конфигурационный файл, в котором вы могли бы настраивать введенные зависимости.

Другие советы

Я бы создал перечисление в вашем коде с идентификатором, соответствующим вашей таблице MessageType.Затем в ваших классах просто используйте это, и NHibernate должен иметь возможность правильно отобразить это.

Я отклонился от таблиц перечисления, особенно когда эти данные не нуждаются в управлении данными.Собираетесь ли вы добавлять все больше и больше типов сообщений по ходу работы?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top