在数据库中存储相关值列表的正确方法

时间:2012-09-23 16:51:31

标签: mysql sql sql-server database rdbms

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

| 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之外,我还没有做过任何事情。如果你能用简单的术语描述并提供进一步阅读的链接,将会非常有用。

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

1 个答案:

答案 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