Реализовать отношение один ко многим с помощью массива идентификаторов? - PullRequest
0 голосов
/ 25 марта 2019

Является ли хорошей идеей хранить как 0-1000 идентификаторов глав в массиве в таблице книг и выбирать их из таблицы глав следующим образом:

SELECT id, name, updated FROM chapters
WHERE id IN (SELECT unnest(chapters_array) FROM books WHERE id=$1);

Или лучше создать отдельную таблицу и хранить тамОт chapter_id до book_id?

1 Ответ

1 голос
/ 26 марта 2019

Нет.Помимо нарушения нормальной формы и введения множества проблем, это также кажется неуместным в вашем случае.Книга состоит из n глав.И глава всегда принадлежит одной книге.Это простые отношения 1: n, как вы сами упомянули в заголовке!Вам не нужна «отдельная таблица» .Все, что вам нужно, это идентификатор книги в каждой связанной строке таблицы chapters.Например:

CREATE TABLE chapters
  id serial PRIMARY KEY
<b>, book_id int REFERENCES books(id)</b> -- !
, name text NOT NULL
, updated timestamptz
);

Я добавил ограничение FOREIGN KEY с коротким синтаксисом. Подробности в руководстве здесь. (Это также то, что вы не могли использовать с массивом.)

Тогда ваш запрос для получения всех глав данной книги может быть просто:

SELECT id, name, updated
FROM   chapters
WHERE  book_id = $1;

Хотя вам ничего не нужно из таблицы books, вам даже не нужно включать это в запрос.В любом случае ограничения FK обеспечивают ссылочную целостность.

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