我在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/