我在Postgres中有一个图书数据库,我想添加一个authorId列,但是我不知道当一本书有很多作者时如何使它工作。
作者表

authorId    firstName    lastName
1           Terry        Pratchett
2           Neil         Gaiman

书桌
bookId    name             authorId
1         Good Omens       1, 2

我该怎么做?我的第一个想法是将authorId存储为一个数组。
我想要的查询应该是这样的
SELECT firstName, lastName
FROM author
WHERE authorId IN
    (SELECT authorId
     FROM book
     WHERE bookId=1);

它会把这个还给你
firstName    lastName
Terry        Pratchett
Neil         Gaiman

但我有一种感觉,那是行不通的,还有更好的办法。

最佳答案

教科书上的解决方案是有一个额外的“映射”表来映射书籍和作者。这样,一个作者可以写几本书,一本书可以有几个作者:

CREATE TABLE book_authors (
    author_id INT NOT NULL,
    book_id INT NOT NULL,
    PRIMARY KEY book_authors_pk (author_id, book_id),
    FOREIGN KEY author_fk (author_id) REFERENCES authors (author_id),
    FOREIGN KEY book_fk (book_id) REFERENCES books (book_id)
)

然后,您可以使用join查询书籍的作者:
SELECT first_name, last_name
FROM   authors a
JOIN   book_authors ba on a.author_id = ba.author_id
WHERE  book_id = 1

或者,如果您没有图书的id,则使用books的另一个join将允许您查询其详细信息:
SELECT first_name, last_name
FROM   authors a
JOIN   book_authors ba ON a.author_id = ba.author_id
JOIN   books b ON ba.book_id = b.book_id
WHERE  b.name = 'Good Omens'

关于sql - 一列中有许多外键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50990592/

10-10 10:56