我最近大学毕业,希望掌握我的数据导向技能。为此,我使用MySQL Workbench在本地笔记本电脑上设置了自己的个人数据库。
数据库的目的是记录我从2018年末开始阅读的书籍。我从头开始使用ERD从概念上设计数据库,并了解它们在不同实体之间的关系。我定义了几对多的关系,这导致了我的第一个主要问题
我设计的多对多关系是否合乎逻辑且合理?
(我提供了指向我的ERD的链接,以帮助你们可视化我的数据库)
在设计多对多关系时,我的看法是这样的:
许多不同的书籍可能具有与之关联的许多不同体裁。 因此,需要在Book表和Genre表之间建立多对多关系。>
许多不同的读者可以阅读许多不同的书,许多读者可以阅读许多不同的书,因此需要在Book和Reader之间建立多对多的关系。
我很确定这些关系在逻辑上是有意义的,但是第二意见总是有帮助的。
第二个主要问题是:
(假设多对多关系正确)如何制作JOIN,从而使我可以可视化数据库中与图书相关的流派,而另一个JOIN可以可视化读者读了哪些书?
我习惯于在基本表关系中使用JOINS,但是我在设计联接时并没有处理过很多对复合键表的经验。如何确保正确链接所有表并获取有效记录以显示?
答案 0 :(得分:0)
是的,您需要书籍/流派和书籍/读者之间多对多的关系。
您可能还需要多对多的Book / Author。 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
之间的链接是不必要的,可能会导致数据异常。例如,如果我读了一本被标记为科幻小说的书,但我的读者记录与该流派之间没有任何联系,我真的读过吗?