如何将多个 ID 应用于 Mysql 中的一条记录?
How do I apply multiple id's to one record in Mysql?
我使用 MySQL Workbench 为我的电子商务创建了一个数据库,并且我正在使用 Netbeans 将所有内容放在一起。我几乎没有什么表可以达到我想要达到的目的。其中两个连接在一起的表是 product,当然还有 category。
我正要将数据添加到两个表中。显然,每个 类别 都有自己的 category_id。
问题:一个产品可以分多个类(所以有多个category_id但是我没有知道如何做到这一点,因为 Netbeans 似乎只允许一个 category_id 每个产品,无论我使用命令行还是手动执行。
如图所示,名为mac的产品设置为家用技术,category_id为208。但同样的产品也可以是 209(办公室技术)的一部分。
我该如何实现?每次我需要一个产品属于多个类别时,我是否需要为同一产品输入一个新行?比方说,如果一个产品可以属于 3 个类别,我需要输入 3 条记录吗?有没有另一种方法,因为据我所知,那会很长很累,不是吗?
谢谢
您可以使用另一个 table 来实现此目的。将其命名为 categories_products
。它应该有三列
id
category_id
product_id
然后为产品所属的每个类别创建条目,例如:
id=1,
category_id=208,
product_id=1
和
id=2,
category_id=209,
product_id=1
您需要研究 Many to Many Data Model
理论上,您可以为产品创建一个 table,为类别创建一个 table,然后为两者创建一个 table 到 link。这将允许几乎无限数量的类别,单个产品可以 linked 到。
无法使用您拥有的 table 结构。
最好的选择是将逗号分隔的字符串存储在 category_field 中,并在您的应用程序中处理它,再进行一次查询
第二个选项是创建包含两列 group_categoy_id
和 category_id
的新 table,并在您的产品 table 中使用 group_category_id
而不是 category_id
。在这种情况下,您可以拥有无穷无尽的一组类别,并且您只需要一个查询即可获取所需的所有数据。
这在实体关系术语中称为多对多关系。一个商品可以有多个分类,一个分类可以有多个商品。
要在关系数据库中执行此操作,您需要 三个 tables.
product: product_id, name, description, etc
category: category_id, catname, catdescription, etc
然后这个所谓的加入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 table
中拥有这些条目
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'
请注意,复合主键可防止您将产品多次分配给一个类别,反之亦然。
专业提示:为清楚起见,最好在所有 table 中使用相同的列名称作为您加入的值。例如,product_id
同时出现在 product
和 product_category
table 中。
我使用 MySQL Workbench 为我的电子商务创建了一个数据库,并且我正在使用 Netbeans 将所有内容放在一起。我几乎没有什么表可以达到我想要达到的目的。其中两个连接在一起的表是 product,当然还有 category。
我正要将数据添加到两个表中。显然,每个 类别 都有自己的 category_id。
问题:一个产品可以分多个类(所以有多个category_id但是我没有知道如何做到这一点,因为 Netbeans 似乎只允许一个 category_id 每个产品,无论我使用命令行还是手动执行。
如图所示,名为mac的产品设置为家用技术,category_id为208。但同样的产品也可以是 209(办公室技术)的一部分。
我该如何实现?每次我需要一个产品属于多个类别时,我是否需要为同一产品输入一个新行?比方说,如果一个产品可以属于 3 个类别,我需要输入 3 条记录吗?有没有另一种方法,因为据我所知,那会很长很累,不是吗?
谢谢
您可以使用另一个 table 来实现此目的。将其命名为 categories_products
。它应该有三列
id
category_id
product_id
然后为产品所属的每个类别创建条目,例如:
id=1,
category_id=208,
product_id=1
和
id=2,
category_id=209,
product_id=1
您需要研究 Many to Many Data Model
理论上,您可以为产品创建一个 table,为类别创建一个 table,然后为两者创建一个 table 到 link。这将允许几乎无限数量的类别,单个产品可以 linked 到。
无法使用您拥有的 table 结构。
最好的选择是将逗号分隔的字符串存储在 category_field 中,并在您的应用程序中处理它,再进行一次查询
第二个选项是创建包含两列 group_categoy_id
和 category_id
的新 table,并在您的产品 table 中使用 group_category_id
而不是 category_id
。在这种情况下,您可以拥有无穷无尽的一组类别,并且您只需要一个查询即可获取所需的所有数据。
这在实体关系术语中称为多对多关系。一个商品可以有多个分类,一个分类可以有多个商品。
要在关系数据库中执行此操作,您需要 三个 tables.
product: product_id, name, description, etc
category: category_id, catname, catdescription, etc
然后这个所谓的加入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 table
中拥有这些条目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'
请注意,复合主键可防止您将产品多次分配给一个类别,反之亦然。
专业提示:为清楚起见,最好在所有 table 中使用相同的列名称作为您加入的值。例如,product_id
同时出现在 product
和 product_category
table 中。