我正在做一个需要图书数据库的项目。问题如下:
一本书可以与多个人(作者、编辑、翻译者等)相关。那么一个人可能会以不同的角色为不同的书籍做出贡献。
Book1 PersonA (author), PersonB(editor)
Book2 PersonC (author), PersonB(translator), PersonD(editor)
Book3 PersonE (author), PersonA(editor)
Run Code Online (Sandbox Code Playgroud)
我有一张BOOKS桌子(bookID, bookTitle),一张PEOPLE桌子(personID, personName)和一张ROLES桌子(roleID, roleName)。然后我需要一种方法来关联这些表,然后查询它们。我想到了一个具有以下行结构的连接表:
bookId personID roleID
Run Code Online (Sandbox Code Playgroud)
这是处理这个问题的最佳方式吗(在所有这些表上插入、更新和删除条目时)?如果没有,有哪些替代方案?
注意:我使用的是 SQLite3。
PS:我希望我对术语的使用是正确的。
我正在研究图书数据库。除其他外,我有以下两个表(针对问题进行了一些简化):
tblBook: ID, Title
tblPerson: ID, Name
Run Code Online (Sandbox Code Playgroud)
请注意,该tblPerson表包含作者、翻译者和编辑(不仅是作者)。
很明显,这两个表是多对多的关系,所以我也有如下联结表:
tblBookAuthorJunction
tblBookTranslatorJunction
tblBookEditorJunction
Run Code Online (Sandbox Code Playgroud)
但是当涉及到加入表以选择所有角色时,我遇到了一个问题:如何创建一个查询以获得一个看起来像这样的表:
BookTitle AuthorName TranslatorName EditorName
Run Code Online (Sandbox Code Playgroud)
这是可能吗?我的查询应该是什么样的?
编辑:您可以为 RDBMS 假设 SQLite。
到目前为止,有两个包含查询的答案。我想将这些答案与可能会发现此信息有价值的其他人进行比较...请注意,连接表的名称与问题中的名称略有不同。而且,是的,我知道,测试数据很无聊。
我自己的回答中的查询如下:
SELECT B.BookTitle, P1.PersonName, P2.PersonName, P3.PersonName
FROM tblBook B
LEFT JOIN tblBookAuthor A ON B.BookID = A.BookID
LEFT JOIN tblPerson P1 ON A.AuthorID = P1.PersonID
LEFT JOIN tblBookTranslator T ON B.BookID = T.BookID
LEFT JOIN tblPerson P2 ON T.TranslatorID = P2.PersonID
LEFT JOIN tblBookEditor E ON B.BookID = E.BookID
LEFT JOIN …Run Code Online (Sandbox Code Playgroud)