我最近刚从大学毕业,并希望掌握我的数据导向技能。我这样做是通过使用MySQL Workbench在我的本地笔记本电脑上建立我自己的个人数据库。
我的数据库的目的是记录我从2018年末开始阅读的书籍。我从头开始使用ERD从概念上设计我的数据库,并了解他们的关系如何在不同实体之间解决。我定义了一些多对多的关系,这导致了我的第一个主要问题
我设计的多对多关系是否合乎逻辑且有意义?
(我已经包含了一个指向我的ERD的链接,以帮助您查看我的数据库)
在设计多对多关系时我看待它的方式是这样的:
许多不同的书籍可以有许多不同的类型。因此需要在Book表和Genre表之间建立多对多的关系。
许多不同的读者可以阅读许多不同的书籍,许多读者可以阅读许多不同的书籍因此需要在书籍和读者之间建立多对多的关系。
我很确定这些关系在逻辑上是有道理的,但第二种意见总是有帮助的。
第二个主要问题是:
(假设多对多的关系是正确的)我如何进行JOIN,这将允许我可视化与我的数据库中的书籍相关联的流派和另一个JOIN,以可视化哪些读者阅读哪些书籍?
我习惯在基本表关系中使用JOINS,但在设计连接时,我没有经验使用多对多的复合键表。如何确保正确链接所有表并获取有效记录?
是的,你需要多对多关系Book / Genre和Book / Reader。
您可能还需要书籍/作者的多对多。 Some books有多位作者。
要查询作者我读过的书:
SELECT a.*
FROM Reader AS r
JOIN Book_Reader AS br ON r.Reader_ID = br.Reader_ID
JOIN Book_Author AS ba ON br.Book_ID = ba.Book_ID
JOIN Author AS a ON ba.Author_ID = a.Author_ID
WHERE r.Reader_ID = 'BillKarwin'
我作弊了一点,因为我知道br.Book_ID
与ba.Book_ID
相当,而且我不需要Book
表中的任何属性用于此查询,所以我跳过了Book
表的连接。
Reader
和Genre
之间的联系是不必要的,可能会导致数据异常。例如,如果我读了一本被标记为科幻小说的书,但我的读者记录与该类型之间没有联系,我真的读过吗?