假设我有以下情况。
LocalLibrary
的数据库,包含两个表Books
和Readers
| BookID| Title | Author |
-----------------------------
| 1 | "Title1" | "John" |
| 2 | "Title2" | "Adam" |
| 3 | "Title3" | "Adil" |
------------------------------
读者表看起来像这样。
| UserID| Name |
-----------------
| 1 | xy L
| 2 | yz |
| 3 | xz |
----------------
现在,假设用户可以创建他们阅读的书籍列表(书架,严格包含来自上述作者的书籍,即我们Db中的作者)。那么,在数据库中表示书架的最佳方式是什么?
我最初的想法是BookID
表中Readers
的逗号分隔列表。但对于关系型Db来说,这听起来很尴尬,而且每当我显示用户书籍列表时我也必须拆分它。此外,当用户将新书添加到书架时,除了拆分以逗号分隔的列表并比较两个ID之外,无法检查它们是否已存在于其架子中。删除也不容易。
因此,在一行中,问题是如何恰当地模拟这些情况。 除了MySQL中的简单SELECT和INSERT之外,我还没有做过任何事情。如果你能用简单的术语描述并提供进一步阅读的链接,将会非常有用。
请评论如果您需要更多解释。
答案 0 :(得分:2)
绝对忘记了要添加到Readers表中的以逗号分隔的书籍列表的想法。它将是无法搜索的,非常笨拙。您需要第三个表连接Books表和Readers表。此表中的每条记录代表读者阅读一本书。
Table ReaderList
--------------------
UserID | BookID |
--------------------
您将获得特定用户使用
读取的图书清单select l.UserID, r.Name, l.BookID, b.Title, b.Author
from ReaderList l left join Books b on l.BookID = b.BookID
left join Readers r on l.UserID = r.UserID
where l.UserID = 1
正如您所看到的,此模式需要使用关键字JOIN,它可以从两个或多个表中获取togheter数据。您可以在此article中了解有关加入的更多信息 如果需要,可以增强此模型,向ReaderList添加另一个字段,如ReadingDate