我可以在我的个人MySQL项目中得到一些意见吗?特别是多对多关系

时间:2019-02-20 00:53:33

标签: mysql join many-to-many erd

我最近大学毕业,希望掌握我的数据导向技能。为此,我使用MySQL Workbench在本地笔记本电脑上设置了自己的个人数据库。

数据库的目的是记录我从2018年末开始阅读的书籍。我从头开始使用ERD从概念上设计数据库,并了解它们在不同实体之间的关系。我定义了几对多的关系,这导致了我的第一个主要问题

我设计的多对多关系是否合乎逻辑且合理?

(我提供了指向我的ERD的链接,以帮助你们可视化我的数据库)

在设计多对多关系时,我的看法是这样的:

许多不同的书籍可能具有与之关联的许多不同体裁。 因此,需要在Book表和Genre表之间建立多对多关系。

许多不同的读者可以阅读许多不同的书,许多读者可以阅读许多不同的书,因此需要在Book和Reader之间建立多对多的关系。

My ERD

我很确定这些关系在逻辑上是有意义的,但是第二意见总是有帮助的。

第二个主要问题是:

(假设多对多关系正确)如何制作JOIN,从而使我可以可视化数据库中与图书相关的流派,而另一个JOIN可以可视化读者读了哪些书?

我习惯于在基本表关系中使用JOINS,但是我在设计联接时并没有处理过很多对复合键表的经验。如何确保正确链接所有表并获取有效记录以显示?

1 个答案:

答案 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_IDba.Book_ID是可比的,并且我不需要Book表中的任何查询属性,因此我跳过了联接到Book表中。

ReaderGenre之间的链接是不必要的,可能会导致数据异常。例如,如果我读了一本被标记为科幻小说的书,但我的读者记录与该流派之间没有任何联系,我真的读过吗?