这在实体关系术语中称为多对多关系。一个产品可以有多个分类,一个分类可以有多个产品。
要在关系数据库中执行此操作,您需要 三个 表。
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 显示在 product 和 product_category 表中。