【问题标题】:How do I apply multiple id's to one record in Mysql?如何将多个 id 应用于 Mysql 中的一条记录?
【发布时间】:2015-01-30 19:36:56
【问题描述】:

我使用 MySQL Workbench 为我的电子商务创建了一个数据库,并且我正在使用 Netbeans 将所有内容放在一起。我有几张桌子可以达到我想要达到的目的。其中两个连接在一起的表是product,当然还有category

我正在将数据添加到两个表中。每个category 显然都有自己的category_id

问题: 一个产品可以属于多个类别(因此有多个 category_id 但我不知道该怎么做,因为 Netbeans 似乎只允许一个category_id 每个产品,无论我是使用命令行还是手动操作。

正如您在图片中看到的,名为 mac 的产品设置为 technology for home,其 category_id 为 208。但同样的产品也可能是 209(办公技术)的一部分。

我该如何实现呢?每次我需要一个产品成为多个类别的一部分时,我是否需要为同一个产品输入一个新行?假设一个产品可以属于 3 个类别,我需要输入 3 条记录吗?有没有其他方法可以这样做,因为据我所知,这会很长而且很累,不是吗?

谢谢

【问题讨论】:

    标签: mysql database netbeans mysql-workbench


    【解决方案1】:

    这在实体关系术语中称为多对多关系。一个产品可以有多个分类,一个分类可以有多个产品。

    要在关系数据库中执行此操作,您需要 三个 表。

    product:  product_id, name, description, etc
    category: category_id, catname, catdescription, etc
    

    然后这个所谓的join table来建立产品和类别之间的关系。

    product_category:  product_id, category_id
    

    product_category 的主键是两列一起——它是一个复合主键。

    如果你有这些产品

    1 chromebook
    2 minitower
    3 macbook
    4 laptop
    

    以及这些类别

    1 chromeos
    2 portable
    3 windows 7
    4 macos
    

    然后您将在您的 product_category 表中拥有这些条目

    1  1   chromebook categories: ... chromeos
    1  2                          ... portable
    2  3   minitower category     ... windows 7
    3  2   macbook categories     ... portable
    3  4                          ... macos
    4  2   laptop categories      ... portable
    4  3                          ... windows 7
    

    所以,如果你想查看每个产品的类别,你可以这样做

     SELECT name, description,
            GROUP_CONCAT(catname) categories
       FROM product
       JOIN product_category USING (product_id)
       JOIN category USING (category_id)
    

    同样,如果您想要所有笔记本电脑,您可以这样做。

     SELECT name, description
       FROM product
       JOIN product_category USING (product_id)
       JOIN category USING (category_id)
      WHERE catname = 'laptop'
    

    如果你想要所有的 macos 笔记本设备,那就有点复杂了。

     SELECT name, description
       FROM product p
       JOIN product_category pca ON p.product_id = pca.product_id
       JOIN category ca   ON pca.product_id = ca.product_id
                         AND ca.catname = 'macos'
       JOIN product_category pcb ON p.product_id = pcb.product_id
       JOIN category ca   ON pcb.product_id = cb.product_id
                         AND cb.catname = 'laptop'
    

    请注意,复合主键会阻止您将产品多次分配给一个类别,反之亦然。

    专业提示:为清楚起见,最好在所有表中使用相同的列名来表示要连接的值。例如,product_id 显示在 productproduct_category 表中。

    【讨论】:

    • 非常感谢您构建的答案。我刚刚使用数据库在 Workbench 中创建了第三张表。按照你的建议,我应该从类别到第三张表做一个箭头,从产品到第三张表做一个箭头是这样的吗?还是从第 3 个箭头指向产品和类别?
    • 我拥有的 MySQL Workbench 的副本在“图表”绘图面板的右侧提供了一个 n::m 项(放置一个新的 n:m 标识关系)。如果您单击它,然后单击您的产品表,然后单击您的类别表,Workbench 将使您成为一个连接表。它会将其命名为“product_has_category”,但您可以将其名称更改为“product_category”。
    【解决方案2】:

    您可以使用另一个表来实现此目的。将其命名为 categories_products。它应该有三列

    id
    category_id
    product_id
    

    然后为产品所在的每个类别输入条目,例如:

    id=1,
    category_id=208,
    product_id=1
    

    id=2,
    category_id=209,
    product_id=1
    

    【讨论】:

      【解决方案3】:

      你会想要研究Many to Many Data Model

      理论上,您可以创建一个产品表、一个类别表以及一个链接这两者的表。这将允许单个产品可以链接到几乎无限数量的类别。

      【讨论】:

        【解决方案4】:

        使用现有的表结构是不可能的。

        最好的选择是将逗号分隔的字符串存储在 category_field 中,并在您的应用程序中处理它,再进行一次查询

        第二个选项是创建具有两列group_categoy_idcategory_id 的新表,并在产品表中使用group_category_id 而不是category_id。在这种情况下,您可以拥有无​​穷无尽的类别组,并且您只需要一个查询即可获得所需的所有数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-13
          • 1970-01-01
          • 1970-01-01
          • 2019-02-27
          • 2019-04-23
          • 1970-01-01
          相关资源
          最近更新 更多