0

假设我有以下情况。LocalLibrary一个有两个表的数据库BooksReaders

| BookID|  Title   | Author | 
-----------------------------
|  1    | "Title1" | "John" | 
|  2    | "Title2" | "Adam" | 
|  3    | "Title3" | "Adil" |
------------------------------

读者表看起来像这样。

| UserID| Name | 
-----------------
|  1    | xy   L  
|  2    | yz   | 
|  3    | xz   | 
----------------

现在,假设用户可以创建他们阅读的书籍列表(一个书架,严格包含上述作者的书籍,即我们数据库中的作者)。那么,在数据库中表示该书架的最佳方式是什么。

我最初的想法是表格中的逗号分隔BookID列表Readers 。但对于关系数据库来说,这显然听起来很尴尬,而且我每次显示用户书籍列表时都必须拆分它。此外,当用户将新书添加到书架时,除了拆分逗号分隔的列表并比较两者的 ID 之外,没有办法检查它是否已经存在于他们的书架中。删除也不容易。

因此,总而言之,问题是如何适当地模拟这些情况。除了 MySQL 中的简单 SELECT 和 INSERT 之外,我没有做任何事情。如果您可以用更简单的术语进行描述并提供进一步阅读的链接,那将会很有帮助。

如果您需要更多解释,请发表评论。

4

1 回答 1

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 来将两个或多个表中的数据结合起来。您可以在本文中阅读有关 JOIN 的更多信息
如果需要,您可以增强此模型,向 ReaderList 添加另一个字段,例如 ReadingDate

于 2012-09-23T16:56:23.010 回答