Таблицы базы данных
У меня такой вопрос. Допустим, создается база данных библиотеки, у нас имеется множество жанров. Следовательно имеются таблицы книга(соответственно с id, названием, автором и жанром) и жанр. Одна книга может относиться сразу к нескольким жанрам(допустим больше 5), как в концептуальной модели это отобразить?
Ответы (1 шт):
Это известная проблема с хранением в реляционной базе отношений "многие ко многим" (многие жанры к многим книгам)
Предлагаю решить её так:
у Вас будет таблица книг 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 ('').