与一组id实现一对多关系?

问题描述 投票:-1回答:1

在Book表中将数组中的0-1000个章节ID存储在一起是一个好主意,并从章节表中选择它们,如下所示:

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

或者最好将单独的表格和chapter_id存储到book_id关系?

sql postgresql database-design many-to-many one-to-many
1个回答
1
投票

不会。除了打破正常形式并引入一系列问题之外,在您的情况下,这似乎也是不必要的。一本书有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约束。 Details in the manual here.(这也是你不能用于数组的东西。)

然后,您的查询以获取给定书籍的所有章节可以简单地:

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

虽然您不需要books表中的任何内容,但您甚至不必将其包含在查询中。无论如何,FK约束强制执行参照完整性。

© www.soinside.com 2019 - 2024. All rights reserved.