Таблицы базы данных

У меня такой вопрос. Допустим, создается база данных библиотеки, у нас имеется множество жанров. Следовательно имеются таблицы книга(соответственно с id, названием, автором и жанром) и жанр. Одна книга может относиться сразу к нескольким жанрам(допустим больше 5), как в концептуальной модели это отобразить?


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

Автор решения: S.H.

Это известная проблема с хранением в реляционной базе отношений "многие ко многим" (многие жанры к многим книгам)

Предлагаю решить её так:

у Вас будет таблица книг books (из описания книги при этом убираем идентификатор жанра), таблица жанров genres и таблица отношений между книгами и жанрами books_to_genres.

Последняя таблица содержит пары "id книги (book_id)" - "id жанра (genre_id)". Именно эта пара является в ней PK (primary key)

Теперь у нас есть возможность делать выборку по жанрам (что то вроде select * from books where books.id in (select book_id from books_to_genres where genre_id=12)

А вот таким запросом можно вытащить названия всех книг с соответсвующими жанрами:

    select books.id, books.title, books.author, 
    tgenre=(select STRING_AGG(genre, ', ') from genres where id in 
    (select genre_id from books_to_genres where book_id=books.id))  
    from books

Результат получается примерно таким:

    1   Воспламеняющая взглядом    Стивен Кинг         Детектив, Фантастика, Ужасы
    2   Дверь в лето               Роберт Хайнлайн     Фантастика

Здесь используется функция STRING_AGG() котрая преобразует список в подзапросе в строку, разделенную пробелами. Если в том SQL, с котрым Вы работаете, этой фугкции нет - существует очень похожее решение с использованием FOR XML PATH ('').

→ Ссылка