SELECT goods_id FROM (
SELECT goods_id FROM attr WHERE attr_name = '内存' AND attr_value = '8GB'
UNION ALL
SELECT goods_id FROM attr WHERE attr_name = '存储' AND attr_value = '256GB'
) AS tmp
GROUP BY goods_id HAVING count(*) = 2;
+----------+
| goods_id |
+----------+
| 2 |
+----------+
首先,MySQL完全可以满足这个需求。并不需要引入mongodb来增加额外的依赖,更何况mongodb也不是用来干这个的。
首先,我们需要理清思绪。想清楚我们需要哪几个数据结构
基础表:
产品 product
产品属性 product_attr
产品属性选项 product_attr_set
商品 goods
商品产品属性记录表 product_map
关系:
商品
一对多产品产品
多对多产品属性商品产品属性记录表
一对多产品属性商品产品属性记录表
一对多产品属性选项看起来挺麻烦吧。我做了张图:
模型
实例
之所以这样设计,有以下好处:
使用
产品属性:选项,而不是产品属性:值,这将利于搜索,例如找金色的iphone将会非常简单和精准,利于数据分析。也不会出现商家上传屎黄色iPhone导致数据混乱的情况产品
多对多产品属性,让一些常用的商品属性能够复用。例如T恤码数(X、XL、XXL)这样一个属性可以挂到长袖、短袖、衬衫产品下(当然你也可以只需要一个"上衣")。没有人回答?
筛选时,查找"同时包含"多个特定配置条件的商品集合,可以这样写:
表结构如下: