Как лучше реализовать список enums в MySQL?

у меня есть фильмы у которых есть жанры в виде ENUM. Жанров у фильма естественно может быть несколько. Как лучше это реализовать в MySQL ?

Сейчас это у меня выглядит так - введите сюда описание изображения


Ответы (2 шт):

Автор решения: BccHnw

Таблица Genre с колонкой id и какими нужно другими колонками (название и т.п.). Одна строка - один enum. Таблица MovieGenre с колонкой id и колонками move_id, genre_id, которые ссылаются на id в Movie и Genre, соответственно.

→ Ссылка
Автор решения: Zhenyria

Не вполне ясно, что вы имеете в виду под "Как лучше это реализовать в MySQL" и к чему тут теги java и hibernate.

Но я бы рекомендовал вам поступить следующим образом. Таблицу Movies оставьте такой, какая она у вас есть. Таблицу Genres мы сгенерируем вот так:

CREATE TABLE genres
(
    film_id INTEGER NOT NULL,
    genre   VARCHAR,
    CONSTRAINT film_genre_idx UNIQUE (film_id, genre),
    FOREIGN KEY (film_id) REFERENCES films (id) ON DELETE CASCADE
);

Таким образом, если у вас будет несколько фильмов, то все их жанры будут храниться в этой одной таблице. Даже если у одного фильма будет более двух жанров, то это будет нормально работать в такой таблице. Теперь перейдём к сущности Movie (вы ведь не просто так ставили теги java и hibernate?). Я покажу вам только то, как аннотировать поле genres в Movie, саму сущность я, думаю, вы уже написали:

    @Enumerated(EnumType.STRING)
    @CollectionTable(name = "genres", joinColumns = @JoinColumn(name = "film_id"))
    @Column(name = "genre")
    @ElementCollection(fetch = FetchType.EAGER)
    private Set<Genre> genres;

Насколько вы видите, тут у нас Set, чтобы вы могли к одному фильму привязать несколько жанров. Аннотация CollectionTable указывает, в какой таблице должно храниться содержимое нашего множества. В аннотацию Enumerated я поставил EnumType.STRING, что позволит элементам ENUM сохраняться в таблицу как строковое значение. Ещё я установил FetchType.EAGER, чтобы при вытаскивании Movie из базы, множество genres было бы проинициализировано и заполнено соответствующими значениями.

В результате записи в таблице genres будут иметь примерно такой вид:

film_id      genre
-------      -----
100001       HORROR
100001       THRILLER
100002       HORROR
100003       THRILLER

Видите? У фильма с id 100001 два жанра: HORROR и THRILLER

→ Ссылка