【问题标题】:Implement one-to-many relationship with an array of ids?用一组 id 实现一对多关系?
【发布时间】:2019-08-16 04:11:27
【问题描述】:

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

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

或者最好制作单独的表并将chapter_idbook_id 的关系存储在那里?

【问题讨论】:

  • 这是一个坏主意,因为它破坏了关系数据库的第一种正常形式。使用书籍表的主键的外键制作章节表。如果可以的话,您不想在一个字段中存储多个数据点。
  • 这是(显然)一个(很容易找到)常见问题解答。在考虑发布之前,请始终在谷歌上搜索您的错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有或没有您的特定字符串/名称,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。 How to Ask

标签: sql postgresql database-design many-to-many one-to-many


【解决方案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 约束无论如何都会强制执行参照完整性。

【讨论】:

    猜你喜欢
    • 2014-10-10
    • 2015-02-06
    • 2017-04-08
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2020-10-15
    相关资源
    最近更新 更多