V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
passion336699
V2EX  ›  PHP

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

  •  1
     
  •   passion336699 · 2016-02-01 15:05:28 +08:00 · 39741 次点击
    这是一个创建于 3211 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我建了 3 个表,produts,produts_attribute,produts_attribute_group;
    products_attribute,用来存商品规格名称以及规格对应的 key;
    products_attribute_group,用来存商品不同规格组合,和该组合对应的库存,单价;
    感觉每次数据库操作起来很麻烦,前后端传值也不是很好,求问有好点的数据库设计嘛?
    第 1 条附言  ·  2019-01-04 17:36:24 +08:00

    不涉及多仓库那种特别复杂的需求, 这是我去年 3 月写的一个自己实现的思路:

    仅供参考: 商品多规格多属性模型设计思路

    96 条回复    2021-05-17 11:49:14 +08:00
    myoula
        1
    myoula  
       2016-02-01 15:18:22 +08:00
    可以参照 ecshop 的设计
    Sunyanzi
        2
    Sunyanzi  
       2016-02-01 16:02:26 +08:00   ❤️ 2
    每个 SKU 拥有独立的 id ... 传值的时候传这一个 id 就可以 ...

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

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

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

    不过别研究 magaento 那个 eav 模型,坑死。
    passion336699
        11
    passion336699  
    OP
       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
        12
    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
        13
    Sunyanzi  
       2016-02-01 18:16:22 +08:00   ❤️ 4
    给你做了个例子 ... 见下 ...

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

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

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

    我看你库存放到了 item 表里,而你说实际应该不在这里。那么你是不是有个库存表,用商品 id 作为关联的?
    kanezeng
        21
    kanezeng  
       2016-02-01 18:59:55 +08:00
    @Sunyanzi 这个结构我觉得挺好理解,就是这句“库存也只是写个意思 ... 实际上库存不在这里 ... ”,那么库存会放在哪里?这么设计的原因又是什么呢?
    ebony0319
        22
    ebony0319  
       2016-02-01 19:02:54 +08:00 via Android
    请记住我的这几点,你说的叫做商品组合,商品多包装,入库时候拆分到最小单品即可。
    naffan
        23
    naffan  
       2016-02-01 19:04:06 +08:00
    @kanezeng 不在面是正确的。设计原因主要就是购物车发生订单的时候会有个锁库存,取消订单时会有个解库存的操作。还有别的对库存的操作,这样就会对存库存的表的 db 操作过大,导致系统平井。所以,我想问的如果你不放在这个表里,那是放哪?如果还是单有个表的话,那么一样也会碰到刚才我的说的那些情况。那么更好的解决方法就是利用 nosql 存,那么问题来了, sunyanzi 你们真的是这样做的么?
    naffan
        24
    naffan  
       2016-02-01 19:05:53 +08:00
    @ebony0319 你有三个手机,分别是 16g 64g 128g 。那么你说的最小单品如何拆分?
    naffan
        25
    naffan  
       2016-02-01 19:06:50 +08:00
    @zzzhc java 的, 不做 java 的还得搭 jdk 吧?
    jarlyyn
        26
    jarlyyn  
       2016-02-01 19:13:58 +08:00
    @naffan

    mpsonyt3red16G
    mpsonyt3red64G
    mpsonyt3red128G
    ebony0319
        27
    ebony0319  
       2016-02-01 19:14:15 +08:00 via Android
    @naffan 理解错误, 16g , 64g 就是最小单品。你要这样理解,怡宝可以一片片卖,可以一箱箱卖,可以跟别的东西促销卖,但是最后入库是一瓶怡宝。
    naffan
        28
    naffan  
       2016-02-01 19:18:27 +08:00
    @ebony0319 请问 jarlyyn 和你说的是一个意思么?
    naffan
        29
    naffan  
       2016-02-01 19:26:41 +08:00
    我按照大家的思想得出以下结论。
    还是 3 个内存量的手机为例,
    在数据库中这个手机为 plu ,存在一张商品表里, id 为 1
    3 个内存量分别存在属性表中,关联这个 id=1 的商品。

    在页面上显示这个手机的页面,会先得到商品 id ,然后通过商品 id 获取属性,然后循环出 3 个内存量的规格。
    然后用户进入页面访问,默认为 16g 。 url 中带着 id=1 , item=1 。当用户选择 64g ,则 url 改为 id=1 , item=2.
    naffan
        30
    naffan  
       2016-02-01 19:29:26 +08:00
    当用户产生购买行为的话,买了台 64g 的。那么我们就需要把这个 64g 手机的库存减少。而这样设计的话,库存其实应该与 item 做关联吧?
    passion336699
        31
    passion336699  
    OP
       2016-02-01 19:30:01 +08:00
    @Sunyanzi 谢谢小哥~
    naffan
        32
    naffan  
       2016-02-01 19:33:46 +08:00
    @passion336699 你理解了么?我现在很关注这个帖子
    Sunyanzi
        33
    Sunyanzi  
       2016-02-01 19:37:00 +08:00
    @naffan @kanezeng 对于简单的情况来说写在 Item 表里也没什么问题 ...

    但实际的库存远不是一个数字就能简单解决的 ... 记录各大区各仓库的库存情况就不止一张表了 ...

    加上出入退库记录 ... 货物调配 ... 库耗控制 ... 呆滞警报等等杂七杂八的事情 ...

    再算上厂家直发的部分 ... 总之库存这两个字的复杂程度绝对超乎你想象 ...
    passion336699
        34
    passion336699  
    OP
       2016-02-01 19:37:25 +08:00
    我最开始的那 3 个表,已经实现了,商品库存及对应规格库存的下单减少,取消订单回退的效果了,只是感觉数据解析起来太麻烦,而且下单的时候,那个值传的..不是很好控制.
    我除了直接下单需要操作库存,拿单价,购物车多个商品还要再来一遍,实在是很头疼..
    1.京东那种,每个规格就相当于一件单独的商品,点击不同规格会把页面重新 load 一遍;
    2.淘宝那种都放一个页面,然后前端控制显示对应库存和单价;
    1 和 2 哪种会更方便实现...
    passion336699
        35
    passion336699  
    OP
       2016-02-01 19:38:38 +08:00
    我的业务并没有那么复杂,只是想换个更好的表来替换掉原来实现多规格的逻辑
    passion336699
        36
    passion336699  
    OP
       2016-02-01 19:44:19 +08:00
    @naffan 我..我我..还是没太理解透
    京东那种我懂了一点点,
    譬如说,iphone, 是手机,就是一个很普通的商品,即一件单品,有一个 product_id;
    然后规格来了,16G 土豪金 iphone (A),16G 太空灰 iphone(B);
    A,B 两个规格的 sku_id,关联着同一个 product_id;
    我在商品详情页面显示这个 product_id 的 iphone 的时候,前端去找后台拿到它下面所有 sku_id 的数据;
    然后 js 把这数据渲染到我页面的 tmpl 上,用户下单的时候,我就传 sku_id,就够了.

    -----不知道是不是这么玩的..
    Sunyanzi
        37
    Sunyanzi  
       2016-02-01 19:53:21 +08:00
    @passion336699 你可以同时实现 1 和 2 ... 不想 reload 的话一次读完前端控制切换就好 ...

    论方便实现的话哪种都方便 ... 但这两种方式其实并不仅仅是刷不刷新页面的区别 ...

    你还是没 Get 到点 ... 这两种模式最核心的区别在于能否直接通过 URL 选中商品的规格 ...

    所以具体选择用哪种还是要看你的业务场景 ... 没办法一概而论的 ...
    passion336699
        38
    passion336699  
    OP
       2016-02-01 20:00:42 +08:00
    @Sunyanzi 对哦..好像是那个意思,我现在的业务场景不需要通过 URL 选中商品的规格,我只需要后台把规格的数据直接传给前台就够了.
    一旦我用了 sku_id,后面的生成订单,退换货等,我都存 sku_id,对吧?就不再使用 product_id 了.
    还有个小问题...
    produts 表的库存总量,是我的代码控制,让 sku_id 里面的库存累加,还是让管理员自己输入,一般是哪种做法呢?现在我项目用的是后者.
    500miles
        39
    500miles  
       2016-02-01 20:03:33 +08:00
    这种情况 我更喜欢 mongo

    关系型数据库 对付这种无限规格 实在是太蛋疼....
    Sunyanzi
        40
    Sunyanzi  
       2016-02-01 20:10:29 +08:00
    @passion336699 你怎么用代码控制 ..? 一种三色手机只有白色有货用户下黑色单你能过 ..?

    以及我顺便提一句 ... URL 和规格无关代表用户点击进来必须手动勾选规格或者只能买默认 ...

    如果不确定的话还是问问你们产品吧 ... 省得做完了再改 ...
    neetrorschach
        41
    neetrorschach  
       2016-02-01 20:14:02 +08:00
    竟然看到了鸭子
    Sunyanzi
        42
    Sunyanzi  
       2016-02-01 20:23:20 +08:00
    @neetrorschach (<ゝω·)☆ 绮罗星~ ☆ kira

    嘛其实我也是手贱啦 ... 本来都决定了不谈论技术的 ...

    结果看到这种对口的问题还是忍不住啊 ...
    coolmenu
        43
    coolmenu  
       2016-02-01 21:19:27 +08:00
    mark,关注一下
    crayhuang
        44
    crayhuang  
       2016-02-01 21:38:04 +08:00
    建议可以参考 IBM WCS 的表设计
    ebony0319
        45
    ebony0319  
       2016-02-01 23:13:44 +08:00 via Android
    @naffan 最简单的来说吧。厅装哈尔滨啤酒有一厅厅卖,然后也有可能 6 个一组组卖,也有可能一件件卖( 24 厅)。每一种规格都是一种新的价格。当我们输入一件件条码,一组组条码时候系统应该自动拆分为单厅条码入库。原因很简单,别人上柜台的时候自动拆分了整件,然后拆分了组。
    sku , Stock Keeping Unit (最小存货单位)。
    ebony0319
        46
    ebony0319  
       2016-02-01 23:23:20 +08:00 via Android
    @naffan 兄弟我觉得那个 sku 你理解上跟我有偏差。
    Insomnia
        47
    Insomnia  
       2016-02-01 23:24:27 +08:00
    个人感觉 @Sunyanzi 的方法比较好,就是京东的这样的方式。
    realpg
        48
    realpg  
       2016-02-01 23:35:38 +08:00
    别纠结 SKU 什么的。
    很讨厌跟阿里系出身的程序员、受阿里系代码逻辑影响谈商城系统设计。
    天天就 SKU SKU 的……

    只要有任何参数不同的,就是两种商品。
    然后,提现所谓 SKU 的,只是显示层聚合,就是在 itemshow 的页面里面,根据配置去把本质是定义成不同的商品的东西聚合显示而已。

    这种结构清晰,性能损失小,而且容易充分利用缓存系统。
    jarlyyn
        49
    jarlyyn  
       2016-02-02 09:10:32 +08:00 via Android
    @realpg

    sku 和阿里什么关系?
    realpg
        50
    realpg  
       2016-02-02 10:01:48 +08:00
    @jarlyyn
    反正我发现他们出来的开发,天天把这个挂嘴上……
    jarlyyn
        51
    jarlyyn  
       2016-02-02 10:07:47 +08:00
    @realpg

    难道不是因为这个是业界标准,甚至出现在阿里创立之前么?

    https://zh.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E5%AD%98%E8%B4%A7%E5%8D%95%E4%BD%8D
    naffan
        52
    naffan  
       2016-02-02 11:58:30 +08:00
    @realpg 永远不可能是程序员开始提 sku 这玩意的,要赖也得赖产品。程序只是照产品的意思表达的
    realpg
        53
    realpg  
       2016-02-02 12:03:17 +08:00
    @naffan
    我说的不只是 SKU 这个名词
    我表达不太好抱歉
    很多阿里出来的高级开发,就总想着把 SKU 做到一起去,类似一楼的思想,就是这些东西一定是关联的,然后搞出一堆复杂的逻辑,可能内部实现非常好,技术、性能都非常牛逼,别人一看巨复杂,而且难以改变这个思想。
    naffan
        54
    naffan  
       2016-02-02 13:34:38 +08:00
    @realpg 不用道歉哈,多大点事。

    不过话说回来。这东西还真是处处关联的吧。同时,也需要一堆复杂的逻辑吧?
    realpg
        55
    realpg  
       2016-02-02 13:36:54 +08:00
    @naffan

    实际生产上,我自己做的项目,以及我曾经加入的几个团队,都不是阿里那种处处关联的玩法。
    每个 SKU 都是一个独立商品,在 item_show 的逻辑上进行一下关联聚合的比较多 顶天二次 ajax 一个库存余量虚了一些不存在的组合
    naffan
        56
    naffan  
       2016-02-02 14:01:14 +08:00
    @sujin190 请问你是如何看出的京东和淘宝是不同的唯独。我看京东怎么都是静态页面呢?
    naffan
        57
    naffan  
       2016-02-02 14:06:45 +08:00
    @realpg 那咱们先不说阿里的玩法吧。就说你参加的几个项目。照你所说,我感觉你的意思和楼主所说的表设计差不太多。但是,@Sunyanzi 说如果每个 sku 都是一个独立商品会后患无穷,具体什么后患我不清楚只有过来人才能说出。不知道你能不能提供个建表思路呢?感谢
    realpg
        58
    realpg  
       2016-02-02 14:13:42 +08:00
    @naffan 我现在都是手机,最近长期驻医院陪护,等我倒开空给你发一组。楼主的我看的也不太仔细。

    粗略的说 我的建表思路就是所有都独立商品,然后一个表存储哪些商品聚合在一起显示,一个额外的表对于非单条件聚合提供关联方式(比如颜色和尺码双选择这种)

    具体表结构等我忙完给你找代码示例吧。
    naffan
        59
    naffan  
       2016-02-02 14:19:15 +08:00
    @realpg 首先,谢谢你热情。其次,得祝福一下你陪护的亲人,望能快快好起来。今年,我姥姥也有一次肺炎住过院,要命的病陪护很费自己的精力和体力。我完全能理解。请原谅允许我说下私心话,由于我也处在电商的项目中,时间不等人,我也强烈期望着有经验人的经验,望能够理解。不过,没有关系我可以尽量等待哈哈。
    最后,愿你以及你的家人过一个好春节。
    naffan
        60
    naffan  
       2016-02-02 14:30:53 +08:00
    @ebony0319 每个人对 spu 和 sku 都有自己的理解,可是真理只有一个,那么我们可以讨论一下什么是 spu 和 sku 。这样有助于理解的正确化,也有助于帮助程序提早的矫正框架的 spu 和 sku 概念。下面,我说说我对这两个单词概念的理解。
    spu 就是商品,是不同 sku 组合成的一个实体。 比如, iphon6 就是一个 spu , iphone5 就是一个 spu 。
    sku ,最小单位化,和你刚才说的一样。不如,颜色,大小,重量。

    那么总结起来,颜色 sku 为金色,大小 sku 为 6.5 寸,重量 sku2kg (数都是我随便举的)。组合起来的就是 spu 是土豪金 iphone6plus 。 同样,白色的 iPhone6plus 又是另一个 spu 。但是,金色和白色都是 iphone6plus 这款产品。 不知道我这么理解有没有问题,如果有请帮指正,感谢
    naffan
        61
    naffan  
       2016-02-02 14:40:47 +08:00
    我 google 了下 spu 和 sku 的理解。第一篇文章的作者和我的想法一样: http://www.biaodianfu.com/spu-sku.html
    naffan
        62
    naffan  
       2016-02-02 14:49:09 +08:00
    https://www.zhihu.com/question/19841574 这个是知乎专门问 spu 和 sku 的。回复的人跟我说的不一样。而我觉得人家说的很对~我开始感觉我的理解出现了偏差。。
    naffan
        63
    naffan  
       2016-02-02 14:54:42 +08:00
    经过我的思考。我否定了刚才我的理解。现在重新归纳,望大家指出不对的地方

    中国产的 iphone6plus 是一个 spu 那么金色 6.5 寸 2kg 是一个 sku 。白色 6.5 寸 2kg 是一个 sku
    sujin190
        64
    sujin190  
       2016-02-02 15:35:18 +08:00
    @naffan 伪静态,数字就是商品 ID ,也就是 skuid ,你可以对京东和淘宝的分别加一下购物车看下参数就知道他们怎么设计的数据结构了,淘宝加购物车有两个 id ,一个是 item_id,另一个是 skuId ,京东则只有一个 pid
    alore
        65
    alore  
       2016-02-02 17:53:47 +08:00
    实际上,商品系统的开发,有非常多的因素需要考虑。不仅仅是满足当下需求的问题,你得知道,给你需求的业务口人员,可能自己都搞不懂真实的需求是什么,或者会变成什么。
    如果是我做,对于一个全新的电商项目的商品部分的数据结构,说一个偷懒的做法,仅供参考:
    1 、分析提取商品的最大共性,比如名称,描述等形成商品表;
    2 、然后所有个性信息,比如颜色,规格等等,全部用一个 XML 描述。这个 XML 描述也存在上述商品表的某个字段中;
    3 、针对后台维护和前端显示,通过前端 JS 实现各种需求下数据的各种常见呈现和操作,同时 JS 能够对不同版本的商品 XML 向下兼容。

    这样做的好处是,减低未知需求变化对数据层的影响。反正业务部门需求天天都在变,我们最终只在 XML 上做描述就可以实现这一块的业务变更。技术资源主要投入在通用组件的开发上,比如根据 XML 结构自动形成下拉条,多选框之类的东西。

    再有像库存数量变化的问题,实际运行中会有很多情况发生,比如下单暂未付款的库存锁定、释放等等,这个和业务部门的需求都是密切相关的,也许这次是要下单就减库存,也许下次就变成未付款超时释放库存,这些都是不确定的。那这种情况下,技术部门当下要考虑的就是,怎样做好技术储备,在需求变化时用最小的投入最快的满足需求。
    以上,参考参考。
    passion336699
        66
    passion336699  
    OP
       2016-02-02 18:21:59 +08:00
    @alore 那这个 xml 的数据格式弄成怎样的呢?也是存 金色 6 寸 100(库存) 88.00(单价) 这些数据?
    naffan
        67
    naffan  
       2016-02-02 18:22:00 +08:00
    @sujin190 我按照你说的做了一下。和你说的有些出入
    http://cart.jd.com/addToCart.html?rcd=1&pid=10031739234&rid=1454408050513&em=
    这个是京东的, pid 的话是 productid , rid 就不知道是干什么的了,至于 em 就更不知
    https://buy.tmall.com/order/confirm_order.htm?x-itemid=44482631034&x-uid=134565651&spm=a220o.1000855.1.1.XA7jIf
    这个是淘宝天猫的, itemid 是商品 id , uid 是我登入的用户 id , spm 看不出来是啥?
    naffan
        68
    naffan  
       2016-02-02 18:51:35 +08:00
    @alore 说的是这个庞大系统中的一小部分。就是这个小部分还会有不同的业务逻辑。所以,我们还是把问题放在一个地方上,防止发散。
    hellokittyer
        69
    hellokittyer  
       2016-02-02 19:04:18 +08:00
    来个直接点的吧, show me your code
    sujin190
        70
    sujin190  
       2016-02-02 22:20:42 +08:00
    @naffan 真正加购物车的不是这两个。。。 ajax 请求里做的,这两个只是加成功的提示页
    alore
        71
    alore  
       2016-02-02 22:29:04 +08:00   ❤️ 1
    @passion336699 是啊,把所有关于具体商品的差异都用 XML 中描述和储存。
    XML 的字段内容类似这样:
    <商品属性>
    <商品编码>SPU_ID</商品编码>
    <颜色>
    <白色>
    <16G 价格=5000></16G>
    <64G 价格=6000></64G>
    </白色>
    <玫瑰金>
    <16G 价格=5000></16G>
    <64G 价格=6000></64G>
    <玫瑰金>
    </颜色>
    <其他属性.../>
    </商品属性>

    然后你要写什么就都放里面好了,最后做一个解析器去解析和呈现 TA 。这个 XML 的结构是可以有版本的,比如你今天做手机有如上属性,过一段日子你可能要做服装,那么在这个基础上增加元素就好了。
    这样你主表中只要存储诸如 SPU_ID 这样的所有商品都具备的共有属性就可以。
    理论上只要是有关联结构的存储,你最终总能实现你所想要的功能。只是实现的代价高低之分。

    其实写着写着,觉得楼上说的没错,有些偏题了。我这个说的是存储灵活的问题,你问的可能是入参规范和涉及的合理数据结构的问题。
    如果是希望入参一致,那么按照楼上一个 SKU 对应一条记录(或一个 XML 内容),应该是比较好的做法了,原则上都是以 SKU 为单位进行存储。
    fszaer
        72
    fszaer  
       2016-02-03 17:34:09 +08:00
    @alore
    用 json 处理更加简洁吧
    不过 mysql 也要 5.7 才支持 json
    pzzrudlf
        73
    pzzrudlf  
       2016-03-25 18:58:26 +08:00 via Android
    zbb
        74
    zbb  
       2016-05-14 11:17:27 +08:00
    @Sunyanzi 这样检索的时候效率如何?
    Sunyanzi
        75
    Sunyanzi  
       2016-05-16 06:08:14 +08:00
    @zbb 咦这么久之前的帖子还能被发现啊 ...

    缓存不算 ... 分类检索是索引命中 ... fakeid 检索是唯一命中 ... 单表的情况下检索效率不能更高 ...

    关键字检索是由另外的系统提供的 ... 就不在这里说了 ...
    v9ex
        76
    v9ex  
       2016-11-03 22:06:22 +08:00
    @Sunyanzi 全部看完回复,认为和 ecshop 和 shopex 结构差不多,一直用这种结构开发商城 3 年,几个问题一直在困恼。
    不知道这么长时间是否还可以看到!

    问题 1 :
    这种结构在做前后台显示规格方面,不能对例如: IPHONE 手机,白色,下面无货的进行过滤,只能按照一个算法把全部规格列出来,不能对超过 2 级的分类,单独控制状态,这个看到你有回复,但不知道有没有解决方案

    问题 2 :
    如果价格,库存这一类商城必须要进行排序的,那么你表里面的 ware_item 这个里面应该必须要记录价格、库存,否者怎么进行排序?

    如果可以,希望能有联系方式,想深度沟通下!
    passion336699
        77
    passion336699  
    OP
       2016-11-04 00:09:04 +08:00 via Android
    @v9ex 兄弟,能放个具体点的表看看嘛。我也还是很困惑
    v9ex
        78
    v9ex  
       2016-11-04 09:47:37 +08:00
    v9ex
        79
    v9ex  
       2016-11-04 09:51:31 +08:00
    @Sunyanzi

    但实际的库存远不是一个数字就能简单解决的 ... 记录各大区各仓库的库存情况就不止一张表了 ...
    加上出入退库记录 ... 货物调配 ... 库耗控制 ... 呆滞警报等等杂七杂八的事情 ...
    再算上厂家直发的部分 ... 总之库存这两个字的复杂程度绝对超乎你想象 ...


    库存这个也是一个问题,如果用其他表来记录,相互交织,很复杂
    Sunyanzi
        80
    Sunyanzi  
       2016-11-07 01:36:57 +08:00
    @v9ex 啊我这两天没注意提醒消息 ... 久等了 Sorry ...

    我刚喝完酒回来现在理解力可能有点跟不上 ... 我没明白你说的「不能单独控制状态」是指什么 ...

    比如 iPhone 白色 对应唯一 SKU id ... 然后这个 SKU id 对应一个库存状态 ... 这有什么查不到 ..?

    另外我这几个系统在用户端都没有按库存排序的功能 ... 如果你有需求就把库存冗余在表里即可 ...

    库存的涉及面很广的 ... 商城只是整个库存管理体系中小小的一环而已 ...

    当然如果你不做后面供货的部分就完全不用管库存的事情 ... 只要做了就肯定会有其他一堆表了 ...

    至于联系方式 ... 你看我的头像 ... 看到那三个定位块 ... 没有想到什么吗 ...
    15208152980
        81
    15208152980  
       2016-11-14 09:21:24 +08:00
    @Sunyanzi 大神 我最近也要设计一个商品&产品&库存的表结构 以前没做过这个 能指点指点吗?看上面的回复 很乱啊 你的头像是二维码?识别不出来啊
    Sunyanzi
        82
    Sunyanzi  
       2016-11-14 09:38:20 +08:00
    @15208152980 点我的用户名 ... 在个人页面扫 ... 如果还是扫不出就试着放大一些页面吧 ...

    以及如果你只是要「指点指点」的话其实我不太知道该说什么诶 ... 你至少得有个方向吧 ..?
    alex8
        83
    alex8  
       2016-11-16 11:33:49 +08:00
    京东的商品 SKU 设计比较优秀
    举个例子:博世的空调滤清器,再商品列表页空调滤清器分类博世品牌下全是同一 SPU 不同 SKU 的热销商品,进入到单个商品页面里,也可以选择其他的 SKU ,选择其他 SKU 就跳转到相应的页面。
    这样价格、库存都在商品表里保存,只需加一个 SKU 表,保存相关的 SKU 商品配置关系即可。
    widdy
        84
    widdy  
       2017-04-17 00:41:30 +08:00
    仔细看了这么多帖子,但是京东的设计仍然有些不明白的地方。
    比如理论上来说 https://item.jd.com/4028192.html 这个页面的 thinkpad 应该都是一个 ware_id ,只是不同的 sku_id ,
    但是我在查看这些不同的 sku_id 商品的时候,发现下面的商品介绍以及规格与包装也都是不一样的,
    根据这里面 http://jos.jd.com/api/detail.htm?id=112 的京东 API 没发现可以直接设置 sku 级别的商品介绍( http://mjbbs.jd.com/thread-79007-1-1.html ),
    这个又貌似表明这些都不是一个 ware_id ,所以又像是 @realpg 的想法,但是查遍了京东的帮助文档,都没有发现设置商品聚合显示的功能。 @Sunyanzi 。有没有在京东开店的来解个惑。
    widdy
        85
    widdy  
       2017-04-17 01:35:15 +08:00
    找到了,应该是 http://help.jd.com/Vender/question-476.html 这个功能
    widdy
        86
    widdy  
       2017-04-17 01:40:16 +08:00
    额,不是的。。。理解错了
    realpg
        87
    realpg  
       2017-04-17 09:58:13 +08:00
    @widdy #84
    我说的是后台架构,不是前台逻辑
    京东的 SKU 在添加商品时候的销售属性添加,为了取得与其他系统的一致性
    widdy
        88
    widdy  
       2017-04-17 10:04:40 +08:00
    @realpg 保持一致性懂了。我只是不太明白京东前台商品详情页的 选择 XX ,应该是在后台有个关联商品的设置才对。类似于苏宁这个功能,商品关联管理产品操作手册( http://stc.suning.com/stc/learn/coursedetails.do?courseCode=100000681) ,但是我找遍了京东的帮助文档和 api 接口等,都没有发现有这个功能,所以不太确认它这个是不是和苏宁一样的做法。
    realpg
        89
    realpg  
       2017-04-17 10:07:17 +08:00
    @widdy #88
    keyword 销售属性 自己找去
    zhangcjl
        90
    zhangcjl  
       2017-04-17 22:44:05 +08:00
    @Sunyanzi
    | 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 |
    请问这样的规格数据要怎么在页面上显示和筛选?谢谢
    LeMango
        91
    LeMango  
       2017-07-25 14:00:46 +08:00
    @ebony0319 请问,拿烟来举例,我按条进货,自动转成最小单位盒的库存之后。可以按盒跟条进行售卖。那么盒的库存应该怎么显示。
    ebony0319
        92
    ebony0319  
       2017-07-25 14:21:45 +08:00 via Android
    @LeMango 您好,这种销售类型为捆绑销售。库存关系是这样的 1 条烟有 10 包烟。你入一条烟自动转换为 10 包。你销售一条自动减 10 包。库存里面没有条的概念(当然你也可以这样合并算,但是可能有十包都是散的不能成条),只有最小单位包。
    ebony0319
        93
    ebony0319  
       2017-07-25 14:23:42 +08:00 via Android
    @LeMango 要做关系条与包要做关系捆绑。有时候一箱东西可能 4 个 a,6 个 b,10 个 c。
    LeMango
        94
    LeMango  
       2017-07-25 15:10:18 +08:00
    @ebony0319 如果条跟包是两个商品,做完关系捆绑,条的库存自动转成包的库存了,那么条的库存显示为 0 还是?
    ebony0319
        95
    ebony0319  
       2017-07-25 18:14:51 +08:00 via Android   ❤️ 1
    @LeMango 设置一个商品类型,虚拟商品。不显示库存的。
    naffan
        96
    naffan  
       2021-05-17 11:49:14 +08:00
    @ebony0319 哈哈哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1035 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 19:29 · PVG 03:29 · LAX 11:29 · JFK 14:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.