【问题标题】:Storing and retrieving multiple values from a foreign table从外表存储和检索多个值
【发布时间】:2011-04-23 14:22:56
【问题描述】:

我有一个表“书籍”,其中有一列“流派”,我想在其中引用另一个包含流派列表的表。
问题是想要在列中存储一个以上的流派。 例如,

ID  | Author          | Title       | Genres
 2  | David Baldacci  |Stone Cold   | 1,4        (action thriller )

具有 2 列 Id 和 Genre 的表“Books Genres”。

1 个动作
2 剧情
3 喜剧
4 惊悚
5 恐怖

这样的事情可以做吗?还是不实用,我应该将流派存储为简单的字符串?

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

    解决此问题的最佳方法是使用所谓的链接表。

    链接表如下所示:

     ID (optional) | BookID| GenreID
     1               2       1
     2               2       4
    

    那么每本书在这个表中可能有多行(或一行)。

    (如果您关心表的行级审计或事务审计 - 您可以使用它来唯一标识该行 - 对于您的问题,不需要它,则可选 ID 将很有用)。

    【讨论】:

    • 大声笑,先给出一个你不明白的答案,然后复制我们更清晰的例子。
    【解决方案2】:

    可以做,但不应该。

    这是糟糕的数据库设计 - 你的数据库应该是normalized

    我建议使用many-to-many table - 带有genreIdbookId 列(每个都是外键,并且一起形成复合主键)。这将作为您需要的链接(一本书可以有多种类型,每种类型可以写很多书)。


    以您的书为例,使用 Book Genres 表,如下所示:

    bookId    genreId
    2         1
    2         4
    

    【讨论】:

    • 但是我怎样才能“打破”这些流派呢?
    • @jullin - 我想我已经解释过了。我将添加一个示例。
    【解决方案3】:

    您需要第三个表,可能称为 BookGenre,它充当多对多关系的“解析器”。 BookGenre 将有两列,BookID 和 GenreID。将在 BookGenre 中为每种类型的每本书添加一行。

    对于您提供的示例数据,BookGenre 中有两行:

    BookID GenreID 2 1 2 4

    【讨论】:

      猜你喜欢
      • 2013-11-01
      • 2023-04-08
      • 2016-03-19
      • 2013-08-28
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多