【问题标题】:Database modeling: best aproach for multiple categories for multiple elements数据库建模:多个元素的多个类别的最佳方法
【发布时间】:2011-12-30 01:02:48
【问题描述】:

假设我有 10 本书,每本书都分配了一些类别(例如:php、编程、烹饪、cookie 等)。

将这些数据存储在数据库中后,我想搜索与某些类别匹配的书籍,并为每对书籍输出匹配的类别。

什么是快速和简单的代码搜索的最佳方法:

1) 为每本书创建一个包含所有类别的列,书的行将是唯一的(每行中的类别用逗号分隔)-> 1NF 的非规范化

2) 制作一列,每行只有一个类别,每本书多行

我认为,如果我将类别 1 逐个存储(方法 2),其他查询会更容易,但对于特定类型的搜索更难。这是正确的吗?

我正在使用 PHP 和 MySQL。

PPS:我知道多关系设计,我不喜欢每次都加入表格。我对某些表使用不同的连接,但这不是问题。我在问这种类型的搜索的数据库设计的最佳方法是什么:用户类型烹饪、饼干、土豆,我想输出具有 1,2 个以上或所有匹配类别的书籍对。我正在寻找一个快速查询,或者这个东西的 php 匹配技术......告诉我你的观点。希望我能理解

【问题讨论】:

    标签: php mysql database modeling


    【解决方案1】:

    使用方法 2 -- 每本书多行,每行存储一个类别。这是让搜索给定类别变得容易的唯一方法。

    这种设计避免了repeating groups within a column,所以对第一范式有好处。

    但这不仅仅是一种学术练习,它是一种适用于各种事物的实用设计。查看我对Is storing a comma separated list in a database column really that bad?的回复

    【讨论】:

    • 是的 80% 我同意你的帖子链接......但正如你所说......有时你可能需要非规范化......我知道更多的查询坚持规范化规则会更好,但是这种类型的搜索会很烦人……无论如何,我想这将取决于我的选择……而且我认为我会像你们所说的那样坚持方法 2。泰
    【解决方案2】:

    您要做的是有一个用于书籍的表格,一个用于类别的表格,以及一个用于连接书籍和类别的表格。像这样的:

    书籍

    book_id | title | etc
    

    类别

    category_id | title | etc
    

    book_categories

    book_id | category_id
    

    这称为多对多关系。您可能应该谷歌它以了解更多信息。

    【讨论】:

    • 如果我只有几个类别,创建一个类别表会不会有点矫枉过正?只存储一个字符串怎么样?
    • 我肯定仍然建议使用单独的类别表。
    【解决方案3】:

    这种关系是多对多的(一本书可以有多个类别,一个类别可以在多本书中使用)。

    那么我们有以下内容:

    知道了吗?

    =]

    【讨论】:

      【解决方案4】:

      我会推荐方法 2。这是因为方法 1 需要对类别列进行全文搜索。

      通过将其拆分为两个表,您可能会取得一些成功:一个表每本书有一行和一个唯一 id(调用该表 books),另一个表每个类别每本书一行并引用该书第一个表中的 id(调用表 bookcategories)。然后,如果您只需要图书数据,则使用表 books,如果您需要类别,则使用 join 两个表。

      【讨论】:

      • 就像说我对某些表/查询使用唯一连接...加入表会破坏添加的每一点安全性...但是是的,你是对的
      • join 如何破坏安全性?
      • 可以说你有 2 个表的不同连接...通过加入它们,你只能使用 1 个连接...如果用于连接查询的连接被破坏,它将使两个表都容易受到攻击.你现在明白了吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 2011-07-22
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多