Как моделировать (Java) Enum в базе данных (с SQL92) - PullRequest
2 голосов
/ 02 апреля 2012

Привет, я моделирую сущность со столбцом с именем «Пол».В коде приложения пол должен быть типом Enum (Java) с двумя значениями (MALE и FEMALE). Как бы вы его смоделировали, зная, что Enums как Datatype не являются частью общего SQL (языка) 92.

Если модель данных должна быть переносимой, чтобы ее могли использовать несколько СУБД (Mysql, Oracle, Derby) и несколько поставщиков персистентности (JPA, Hibernate, JDBC).Я чувствую, что он попадает на 2 уровня: - во-первых, уровень схемы и сущности (сохраните перечисления как -VAR-CHAR или INT) - во-вторых, уровень кода приложения (JDBC не поддерживает перечисления, JPA делает, ноэто зависит от реализации)

Существует ли универсальное решение, применимое, например, к СУБД Mysql?Спасибо !!

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

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

  1. Создайте специальную таблицу для представления вашего перечисления; например Colour. Таблица будет иметь два столбца:
    • Столбец ID (первичный ключ). Обычно автоинкрементный int, smallint или tinyint.
    • A имя столбец (ключ-кандидат). Это будет varchar, значение которого должно совпадать с перечислением Java.
  2. Создание перечисления Java: Color с идентичными значениями таблицы Colour в базе данных.
  3. Предполагая, что теперь у вас есть таблица «Данные», содержащая записи, которые ссылаются на таблицу Colour, реализуйте хранимую процедуру для вставки записи, которая принимает значение Color String (как описано в вашем перечислении Java); например, * +1025 *

    CREATE PROCEDURE dbo.InsertRecord @colour varchar (32) КАК ...

Хранимая процедура выполнит необходимый перевод строки в int, позволяя вашей таблице данных ссылаться на таблицу Color через внешний ключ int.

Точно так же вы можете создать представление ваших таблиц данных, которые будут присоединены к таблице цветов за кулисами, чтобы представить денормализованные данные ваших данных обратно приложению или конечному пользователю.

Альтернатива подходу хранимых процедур заключается в том, что вы читаете и кэшируете порядковый номер, сопоставления имен в вашем приложении при запуске. Преимущество этого заключается в возможности проверки целостности вашего перечисления Java Color по сравнению с содержимым вашей таблицы Color в базе данных.

1 голос
/ 02 апреля 2012

Перечисления имеют как минимум два свойства, по которым они могут быть идентифицированы: порядковый номер (позиция экземпляра в списке перечисления) и имя.Оба могут храниться в базе данных и использоваться для получения правильного экземпляра перечисления.

Если вы используете OR-маппер, такой как Hibernate, он сделает это за вас, в противном случае вам нужно будет вручную преобразовать перечислениек целому числу / длине или строке и наоборот.

Чтобы сделать его более безопасным, вы можете добавить пользовательское свойство в свой enum и предоставить получатель для свойства, а также функцию преобразования для свойства-> enum value.Таким образом, вы можете изменить порядок и переименовать значения перечисления, если вы не измените это свойство id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...