先来看一下ECSHOP添加商品的主页,其实这部分很奇怪,因为在ECSHOP中,在商品添加页中并没有设置库存数量的这一选项:
图1 ECSHOP后台商品添加页面
而且看保存大部分商品信息的goods表(ecs_goods),在其中也没有直接保存商品库存数量的字段:
图2 ECSHOP商品表(ecs_goods)
因为商品库存数量如果直接保存在goods表中的一个字段的话是不完整的,因为商品有不同的属性,各个属性下商品的数量是不同的,而且这些属性还不是相互独立的,看下面这张表:
表1 所需存储数据表
颜色/款式 | 运动鞋 | 篮球鞋 | 登山鞋 | 轻跑鞋 | 休闲鞋 |
---|---|---|---|---|---|
玫瑰红 | 1 | 2 | 3 | 4 | 5 |
运动紫 | 6 | 7 | 8 | 9 | 10 |
商务黑 | 11 | 12 | 13 | 14 | 15 |
复古褐 | 16 | 17 | 18 | 19 | 20 |
- 属性1:颜色,具体的值有:玫瑰红,运动紫,商务黑,复古褐
- 属性2:款式,具体的值有:运动鞋,篮球鞋,登山鞋,轻跑鞋,休闲鞋
这样的形式才是我们一般看见的报表形式,这样的形式怎么存储在mysql中?
可能性1:
表2 错误示范
商品id | 颜色 | 款式 | 数量 |
---|---|---|---|
1 | 玫瑰红 | 运动鞋 | 1 |
2 | 玫瑰红 | 篮球鞋 | 2 |
。。。。。。
我就不接着往下写了,这样会存在一个问题,那就是属性字段数量不确定,这里我们提前知道有两个属性,所以设置了字段颜色,款式,可是当我们的属性更多时,这种表结构就无能为力了。
可能性2:
属性与商品的关联表:
关联表id | 属性id | 商品id | 属性值 |
---|---|---|---|
1 | 款式 | 1 | 运动鞋 |
2 | 颜色 | 1 | 玫瑰红 |
3 | 款式 | 2 | 篮球鞋 |
4 | 颜色 | 2 | 玫瑰红 |
商品表
商品id | 库存数量 |
---|---|
1 | 1 |
2 | 2 |
然后采用子查询的方法,当输入一个属性的值时,比如玫瑰红,则可以通过商品与属性关联表来查到拥有该属性的商品有1和2,再接着输入下一个属性,比如运动鞋,在上次的查询结果中(1和2),中再进行查询,则可以查出拥有该属性的是1,再来我们再去查商品表就可以查出该商品的具体库存数量了,借用一句教我这种方法的大哥的话:
查询是一个条件叠加一个条件进行的。
这样的确可以满足查村条件,而且也可以针对不同属性下商品设置不同的参数,如价格和库存。
接下来讲讲ECSHOP是如何存储上述情况的。
这里我拿Mysql-WorkBench画了ER图:
图3 ECSHOP存储属性值
其中对应与ECSHOP后台管理界面的内容如下:
- ecs_goods:存储商品大部分信息,也就是图1中的大部分信息
- ecs_attribute:存储商品大部分属性,及其可选值,如上面的例子中,对应到ecs_attribute中就是:
attr_id | attr_name | attr_values |
---|---|---|
1 | 颜色 | 玫瑰用,运动紫,商务黑,复古褐 |
2 | 款式 | 运动鞋,篮球鞋,登山鞋,休闲鞋 |
感觉上这里的attr_values字段有点违反范式。
- ecs_goods_attr:则是ecs_goods和ecs_attribute的关联表,并且负责将ecs_attribute中的attr_values字段拆开,分别存储价格。
goods_attr_id | attr_id | goods_id | attr_value | attr_price |
---|---|---|---|---|
1 | 1 | 1 | 玫瑰红 | 100 |
2 | 1 | 1 | 运动紫 | 90 |
3 | 1 | 1 | 商务黑 | 80 |
4 | 1 | 1 | 复古褐 | 70 |
5 | 2 | 1 | 运动鞋 | 60 |
6 | 2 | 1 | 篮球鞋 | 50 |
- ecs_product:存储库存数量
product_id | goods_id | goods_attr | product_sn | product_number |
---|---|---|---|---|
1 | 1 | 1|5 | 商品货号,由系统生成 | 1 |
2 | 1 | 1|5 | …… | 2 |
这里的good_attr字段其实就是ecs_goods_attr中goods_attr_id字段的组合,表示各自属性的数量,可以对照表1来理解。
ecs_product表对应的其实就是后台管理页面中的这部分:
这部分在图1 中点击确定之后就会跳转到该页面,并在该页面中设置各属性下具体的数量。