大家有做过商品多规格的功能嘛?商品的不同规格对应不同价格和库存一般是如何实现的?

2016-02-01 15:05:28 +08:00
 passion336699
我建了 3 个表,produts,produts_attribute,produts_attribute_group;
products_attribute,用来存商品规格名称以及规格对应的 key;
products_attribute_group,用来存商品不同规格组合,和该组合对应的库存,单价;
感觉每次数据库操作起来很麻烦,前后端传值也不是很好,求问有好点的数据库设计嘛?
39498 次点击
所在节点    PHP
96 条回复
myoula
2016-02-01 15:18:22 +08:00
可以参照 ecshop 的设计
Sunyanzi
2016-02-01 16:02:26 +08:00
每个 SKU 拥有独立的 id ... 传值的时候传这一个 id 就可以 ...

比如一台手机有三网三色两种存储 ... 在数据库里就有 18 条记录 ...

我近两年时间写了三套商城了 ... 我可以很负责任的说如果按照你这么建表后患无穷 ...
ashamp
2016-02-01 16:05:51 +08:00
楼上正解
huijiewei
2016-02-01 16:07:22 +08:00
@Sunyanzi 求教你的建表方式
honeycomb
2016-02-01 16:17:08 +08:00
@huijiewei SKU ,最小存货单位,如果两个商品完全无法从规格上区分,那么它们是同一个 SKU ,比方说一个应用的某个版本的某个渠道包就可以算一个 SKU ,因为无论何时,从这个渠道下载的这个版本总是相同的文件
passion336699
2016-02-01 16:17:57 +08:00
@Sunyanzi 对对,就是这样的,
我这 18 条记录都存在了 products_attribute 里面
(规格 ID,商品 ID,商品属性名,商品属性值);
在 products_attribute_group 里面
(主键 ID,商品 ID,规格属性组合,规格对应库存,规格对应价格),属性组合里面就是按逗号把规格的 ID 存在里面,
例如存的 1,3,4 这样;
因为之前没搞过这一块,现在就已经感觉后患无穷了 T_T...
能分享下建表的方式么..
passion336699
2016-02-01 16:19:09 +08:00
@Sunyanzi 这样建表,查数据,解析都感觉超级麻烦,尤其是东西传到前端,然后页面上的显示,和处理,都很坑爹,实在不知道有啥好的办法..
zacard
2016-02-01 17:31:27 +08:00
不同规格的商品直接当做不同的商品处理,但是可以增加一个字段指向无规格的商品即可。
passion336699
2016-02-01 17:34:29 +08:00
@zacard 没太明白,那还是需要建 3 个表,商品表,规格属性表,SKU 表,类似这样嘛?
SKU 里面存的和我在 products_attribute_group 里面存的字段类似,那和我之前这种差别不大啊
jarlyyn
2016-02-01 17:35:15 +08:00
SKU ,然后加个现实 SKU 不就好了,再价格状态不及好了。

多研究其他软件的数据库结构吧。

不过别研究 magaento 那个 eav 模型,坑死。
passion336699
2016-02-01 17:43:29 +08:00
@jarlyyn 意思就是两张表,products 表和 sku 表,
sku 表里面存的就是 sku_id,product_id,attribute_key,attribute_val,stock,price,
我并不需要把 attribute_key 和 attribute_name 单独用一张表存起来,
在商品详情里显示多规格选项的时候,我只需要拉取 products_id 对应的 sku_id 的数据就好了,是这个意思嘛?
jarlyyn
2016-02-01 17:55:37 +08:00
@passion336699

1 张表。数据怎么存我不管。

比如有 2 个字段

sku,sku_belongs_to

拉的时候直接拉 sku_belong_to isnull 的。

进入详情页的时候再把 sku_belongs_to 和相关页相符的都拉出来,通过 ajax 切换。

之前一个项目就是这么做的。
Sunyanzi
2016-02-01 18:16:22 +08:00
给你做了个例子 ... 见下 ...

mysql> SELECT * FROM `ware_product`;
+----+----------+--------------+------------------------------+--------+
| id | category | name | attributes | status |
+----+----------+--------------+------------------------------+--------+
| 1 | 329475 | 某种手机 | ["网络","颜色","存储"] | 1 |
| 2 | 131329 | 某种衣服 | ["尺码","颜色"] | 1 |
+----+----------+--------------+------------------------------+--------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM `ware_item`;
+----+-----+--------+--------------+------------------------+---------+-------+--------+
| id | pid | fakeid | name | attributes | price | stock | status |
+----+-----+--------+--------------+------------------------+---------+-------+--------+
| 1 | 1 | 583701 | NULL | ["电信","白","16G"] | 1999.00 | NULL | 1 |
| 2 | 1 | 583702 | NULL | ["电信","黑","16G"] | 1999.00 | NULL | 1 |
| 3 | 1 | 583703 | 最后五台 | ["移动","黑","64G"] | 1999.00 | 5 | 1 |
| 4 | 2 | 241351 | NULL | ["M","红"] | 128.00 | NULL | 1 |
+----+-----+--------+--------------+------------------------+---------+-------+--------+
4 rows in set (0.00 sec)

这是个简单的模型 ... 我把没用的东西比如副标题推荐语图片角标等等都去了 ...

库存也只是写个意思 ... 实际上库存不在这里 ...

Product 表是抽象的产品表 ... 当前产品下的所有 SKU 的共有属性保存在这里 ...

Item 表是具体的详情表 ... 所有涉及交易的实体都存在这里 ...

用户可感知的只有 item.fakeid ... 通过 fakeid 取得其他所有数据 ...
sujin190
2016-02-01 18:24:59 +08:00
看淘宝似乎是相同商品,不同属性,京东则是不同规格不同商品,如果物流自己做又复杂的话,可能不同规格不同商品好一些吧,否则整个流程太复杂了
naffan
2016-02-01 18:29:50 +08:00
"用户可感知的只有 item.fakeid ... 通过 fakeid 取得其他所有数据 ..."
这个 fakeid 具体会做些什么呢?
zzzhc
2016-02-01 18:31:22 +08:00
可以参考下 https://ofbiz.apache.org/的表结构,看看 product 开头的, 可以通过 variant product 实现, 每个 sku 都有自己的 product 记录
naffan
2016-02-01 18:31:24 +08:00
@sujin190 不同商品不同规格的话,没法做的吧?那跟楼主将来会遇到的问题有什么两样?
Sunyanzi
2016-02-01 18:41:10 +08:00
@naffan 你理解成商品 id 就可以 ... fakeid 和自增 id 是一对一的关系 ... 用于数据传输 ...
jarlyyn
2016-02-01 18:55:05 +08:00
@Sunyanzi

这个都该对应 sku 吧……
naffan
2016-02-01 18:59:11 +08:00
@Sunyanzi

“库存也只是写个意思 ... 实际上库存不在这里 ... ”

我看你库存放到了 item 表里,而你说实际应该不在这里。那么你是不是有个库存表,用商品 id 作为关联的?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/254792

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX