将 0-1000 的章节 ID 存储在 Book 表中的数组中并从章节表中选择它们是一个好主意,如下所示:
SELECT id, name, updated FROM chapters
WHERE id IN (SELECT unnest(chapters_array) FROM books WHERE id=$1);
或者最好制作单独的表格并将其存储chapter_id
到book_id
关系中?
将 0-1000 的章节 ID 存储在 Book 表中的数组中并从章节表中选择它们是一个好主意,如下所示:
SELECT id, name, updated FROM chapters
WHERE id IN (SELECT unnest(chapters_array) FROM books WHERE id=$1);
或者最好制作单独的表格并将其存储chapter_id
到book_id
关系中?
不。除了打破正常形式并引入许多问题外,在您的情况下似乎也没有必要。一本书有n个章节。一章总是属于一本书。就像您在标题中提到的那样,这是一个简单的 1:n 关系!您不需要“单独的表”。chapters
您所需要的只是表格中每个相关行中的书的 ID 。喜欢:
CREATE TABLE chapters
id serial PRIMARY KEY
, book_id int REFERENCES books(id) -- !
, name text NOT NULL
, updated timestamptz
);
我添加了一个FOREIGN KEY
语法短的约束。手册中的详细信息在这里。(这也是数组不能使用的东西。)
然后,您获取给定书籍的所有章节的查询可以简单地是:
SELECT id, name, updated
FROM chapters
WHERE book_id = $1;
虽然您不需要books
表中的任何内容,但您甚至不必将其包含在查询中。FK 约束无论如何都会强制执行参照完整性。