小编som*_*ser的帖子

与属性的多对多关系

我正在做一个需要图书数据库的项目。问题如下:

一本书可以与多个人(作者、编辑、翻译者等)相关。那么一个人可能会以不同的角色为不同的书籍做出贡献。

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:我希望我对术语的使用是正确的。

sqlite database-design

6
推荐指数
1
解决办法
600
查看次数

多对多关系

我正在研究图书数据库。除其他外,我有以下两个表(针对问题进行了一些简化):

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。


更新

到目前为止,有两个包含查询的答案。我想将这些答案与可能会发现此信息有价值的其他人进行比较...请注意,连接表的名称与问题中的名称略有不同。而且,是的,我知道,测试数据很无聊。

答案 1

我自己的回答中的查询如下:

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)

sqlite join aggregate

4
推荐指数
1
解决办法
2680
查看次数

标签 统计

sqlite ×2

aggregate ×1

database-design ×1

join ×1