论坛首页 Java企业应用论坛

淘宝商品价格存储结构设计

浏览 17759 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-09-26  
osacar 写道
dagmom 写道
一个商品对应多个价格需要另存一张表,性能还好吧,但是你说的不同size对应不同的价格,那么如果再加一个别的比如颜色,你情以何堪,不同size、color,那应该当作不同商品去做,你看看京东、易讯之类的就知道,选择size之后productId是不同的


呵,可能我们的应用有点特殊,这些产品就只有size这个属性,没有颜色或其他规格属性。
目前我的价格表是这样设置的。不知合适否。
id  productid   sizename   price
1       1          L        100
2       1          XL       125
3       1          XXL      130


如果需要有扩展,可以另外定义一张属性表(用于属性扩展),建立product和属性的关联(product有点类似于抽象产品,只有属性定义),还需要另一张conceret product表,用来存储product上定义的属性的值。如果需要详细点的描述,可以查查erp中style item和SKU item的概念,比较类似。
0 请登录后投票
   发表时间:2012-09-26   最后修改:2012-09-26
osacar 写道
dagmom 写道
一个商品对应多个价格需要另存一张表,性能还好吧,但是你说的不同size对应不同的价格,那么如果再加一个别的比如颜色,你情以何堪,不同size、color,那应该当作不同商品去做,你看看京东、易讯之类的就知道,选择size之后productId是不同的


呵,可能我们的应用有点特殊,这些产品就只有size这个属性,没有颜色或其他规格属性。
目前我的价格表是这样设置的。不知合适否。
id  productid   sizename   price
1       1          L        100
2       1          XL       125
3       1          XXL      130



我水平也有限,说下自己的看法
dagmom 的方法,size还是要存对应的productID信息,最终还是绕不开size单独保存(价格/productID)。但damom也算是一种思路,学习了,谢谢

osacar 的表,个人优化建议,删除id列,productID,sizename联合主键。原因:
           此表特性,是管理员进行维护,不会有太多频繁更新/插入,
                 大部分查询使用=查询,而且都会包含price列
                 少部分统计price会用到范围查询,可以单独建price索引(此处不讨论)
     猜想原表结构索引,id主键,唯一索引(productid,sizename)

   查询效率分析:
       原设计,由于使用=查询,所以肯定会走唯一索引,再根据主键id查找相应的price
       优化后,直接进行主键查找

欢迎大家拍砖
0 请登录后投票
   发表时间:2012-09-26  
babaoqi 写道
osacar 写道
dagmom 写道
一个商品对应多个价格需要另存一张表,性能还好吧,但是你说的不同size对应不同的价格,那么如果再加一个别的比如颜色,你情以何堪,不同size、color,那应该当作不同商品去做,你看看京东、易讯之类的就知道,选择size之后productId是不同的


呵,可能我们的应用有点特殊,这些产品就只有size这个属性,没有颜色或其他规格属性。
目前我的价格表是这样设置的。不知合适否。
id  productid   sizename   price
1       1          L        100
2       1          XL       125
3       1          XXL      130



我水平也有限,说下自己的看法
dagmom 的方法,size还是要存对应的productID信息,最终还是绕不开size单独保存(价格/productID)。但damom也算是一种思路,学习了,谢谢

osacar 的表,个人优化建议,删除id列,productID,sizename联合主键。原因:
           此表特性,是管理员进行维护,不会有太多频繁更新/插入,
                 大部分查询使用=查询,而且都会包含price列
                 少部分统计price会用到范围查询,可以单独建price索引(此处不讨论)
     猜想原表结构索引,id主键,唯一索引(productid,sizename)

   查询效率分析:
       原设计,由于使用=查询,所以肯定会走唯一索引,再根据主键id查找相应的price
       优化后,直接进行主键查找

欢迎大家拍砖


  基本上被你猜对了。
你的优化建议也不错,联合主键我之前没想过。
我只做了productid索引,sizename没做,因为sizename可能为空。比如,一个产品只有一个价格的时候,sizename就可有可无,默认是无。查询使用=productid,一次把产品的所有价格全取出。只有在更新删除时使用id。
我想问一下,查询时是使用product表join price表好还是把查询分成两次查询好?即先select product 然后再次select price。(price表记录数比product表大很多)
0 请登录后投票
   发表时间:2012-09-26  
osacar 写道
babaoqi 写道
osacar 写道
dagmom 写道
一个商品对应多个价格需要另存一张表,性能还好吧,但是你说的不同size对应不同的价格,那么如果再加一个别的比如颜色,你情以何堪,不同size、color,那应该当作不同商品去做,你看看京东、易讯之类的就知道,选择size之后productId是不同的


呵,可能我们的应用有点特殊,这些产品就只有size这个属性,没有颜色或其他规格属性。
目前我的价格表是这样设置的。不知合适否。
id  productid   sizename   price
1       1          L        100
2       1          XL       125
3       1          XXL      130



我水平也有限,说下自己的看法
dagmom 的方法,size还是要存对应的productID信息,最终还是绕不开size单独保存(价格/productID)。但damom也算是一种思路,学习了,谢谢

osacar 的表,个人优化建议,删除id列,productID,sizename联合主键。原因:
           此表特性,是管理员进行维护,不会有太多频繁更新/插入,
                 大部分查询使用=查询,而且都会包含price列
                 少部分统计price会用到范围查询,可以单独建price索引(此处不讨论)
     猜想原表结构索引,id主键,唯一索引(productid,sizename)

   查询效率分析:
       原设计,由于使用=查询,所以肯定会走唯一索引,再根据主键id查找相应的price
       优化后,直接进行主键查找

欢迎大家拍砖


  基本上被你猜对了。
你的优化建议也不错,联合主键我之前没想过。
我只做了productid索引,sizename没做,因为sizename可能为空。比如,一个产品只有一个价格的时候,sizename就可有可无,默认是无。查询使用=productid,一次把产品的所有价格全取出。只有在更新删除时使用id。
我想问一下,查询时是使用product表join price表好还是把查询分成两次查询好?即先select product 然后再次select price。(price表记录数比product表大很多)


个人感觉用一个存储过程,每个表单独查询,这样相当于你自己做了join的逻辑,这个逻辑也不复杂,可以帮数据库分担下
0 请登录后投票
   发表时间:2012-09-26  
太标题党了!!!!。。。。。。。。。。。。
类似淘宝产品价格存储的表,
变成
淘宝商品价格存储结构设计。。。
原来以为内容有用,
进去之后,失望阿。。。。。。
0 请登录后投票
   发表时间:2012-09-26  
如果增加灵活性的话,可以考虑增量价格的设计
商品基础表:
productid  商品其他字段,是否有增量字段,最低价格price
1                        yes             100
增量价格表
productid   type  typename   price
1           size       L        0
1           size       XL       25
1           size       XXL      30
1           color      red      10
1           color      blue     5

..........

这样价格就是基础价格上家选择各个类型子和
商品1  size=XL   color=red   的价格为100+25+5=130

考虑到很多情况下商品不是有人以的组合,而且也为了减少复杂度,可以对增量表做一下简化

id        productId      name          price
1          1             红色L号       10
2          1             红色XXL号     40
3          1             蓝色XL号      30

这两种具体看需求,淘宝从应用角度讲,实现的是上一种,当然上一种也包容了下面的设计
0 请登录后投票
   发表时间:2012-09-26  
lavafree 写道
如果增加灵活性的话,可以考虑增量价格的设计
商品基础表:
productid  商品其他字段,是否有增量字段,最低价格price
1                        yes             100
增量价格表
productid   type  typename   price
1           size       L        0
1           size       XL       25
1           size       XXL      30
1           color      red      10
1           color      blue     5

..........

这样价格就是基础价格上家选择各个类型子和
商品1  size=XL   color=red   的价格为100+25+5=130

考虑到很多情况下商品不是有人以的组合,而且也为了减少复杂度,可以对增量表做一下简化

id        productId      name          price
1          1             红色L号       10
2          1             红色XXL号     40
3          1             蓝色XL号      30

这两种具体看需求,淘宝从应用角度讲,实现的是上一种,当然上一种也包容了下面的设计


我目前使用的应该就是第二种。
0 请登录后投票
   发表时间:2012-09-26   最后修改:2012-09-26
lavafree 写道
如果增加灵活性的话,可以考虑增量价格的设计
商品基础表:
productid  商品其他字段,是否有增量字段,最低价格price
1                        yes             100
增量价格表
productid   type  typename   price
1           size       L        0
1           size       XL       25
1           size       XXL      30
1           color      red      10
1           color      blue     5

..........

这样价格就是基础价格上家选择各个类型子和
商品1  size=XL   color=red   的价格为100+25+5=130

考虑到很多情况下商品不是有人以的组合,而且也为了减少复杂度,可以对增量表做一下简化

id        productId      name          price
1          1             红色L号       10
2          1             红色XXL号     40
3          1             蓝色XL号      30

这两种具体看需求,淘宝从应用角度讲,实现的是上一种,当然上一种也包容了下面的设计

大哥你行不行....用乘法 +舍入  不要用加法 维护组会死的.....

改了一下....看看这个
一般来说特性自定义是有必要的.
类型表
tid name fid
1 颜色  0
2 大小  0
3 xl    2
4 l     2
5 红    1
6 蓝    1

产品类型表
kid pid tid
a3     p1   3
a4     p1   5    
a5     p1   6
库存表
类别  库存
a3,a4  1001
a3,a5  0
折扣表.
<script> function money( price,type,f){ var temp = f(price);if(type=="a3,a4") return temp*80%}  </script>
0 请登录后投票
   发表时间:2012-09-27  
抛出异常的爱 写道
lavafree 写道
如果增加灵活性的话,可以考虑增量价格的设计
商品基础表:
productid  商品其他字段,是否有增量字段,最低价格price
1                        yes             100
增量价格表
productid   type  typename   price
1           size       L        0
1           size       XL       25
1           size       XXL      30
1           color      red      10
1           color      blue     5

..........

这样价格就是基础价格上家选择各个类型子和
商品1  size=XL   color=red   的价格为100+25+5=130

考虑到很多情况下商品不是有人以的组合,而且也为了减少复杂度,可以对增量表做一下简化

id        productId      name          price
1          1             红色L号       10
2          1             红色XXL号     40
3          1             蓝色XL号      30

这两种具体看需求,淘宝从应用角度讲,实现的是上一种,当然上一种也包容了下面的设计

大哥你行不行....用乘法 +舍入  不要用加法 维护组会死的.....

改了一下....看看这个
一般来说特性自定义是有必要的.
类型表
tid name fid
1 颜色  0
2 大小  0
3 xl    2
4 l     2
5 红    1
6 蓝    1

产品类型表
kid pid tid
a3     p1   3
a4     p1   5    
a5     p1   6
库存表
类别  库存
a3,a4  1001
a3,a5  0
折扣表.
<script> function money( price,type,f){ var temp = f(price);if(type=="a3,a4") return temp*80%}  </script>


这个设计扩展必是考虑周到了。
但是我可以肯定的是产品只有一种特性,比如就叫做size了,之后再也不分color之类的了。
价格表里也没有使用折扣算法,而是直接存相应的价格。

挺感谢大家的,不管好坏,至少大家都说了自己的想法
0 请登录后投票
   发表时间:2012-09-27  
我的一个方案 可能复杂点 欢迎拍砖

产品表
id    最低价  最高价  composite


composite{ //通过json存储组合
   组合表:'compite_1',
   组合类型:'A',
   composites:[compositeId1,compositeId2,compositeId3]
}

查询分两步 1查产品 2根据组合id 查组合

颜色表
id productid color

大小表
id productid size

组合类型 用于扩展 比如 A表示以【颜色 大小 组合】  B仅以【颜色组合】 可以用enum

组合类型_组合表(组合多了可以考虑按照规则分表 如产品的id 这个相对简单)
id productid color size price stock

以后新的组合可以采用不同的组合类型 组合表即可


前台显示:
价格默认显示 : 最低价

颜色 大小信息选择 是组合的 然后到info json里查找库存 和 价格

后台新增:
先选择组合类型
再提供一些此组合类型相关的默认选项 让用户选择即可
自动生成组合 默认最低价  然后再改其他价格



当然为了建少组合的连表 可以考虑组合表这样
id productid color size price stock
1  1            Red  L     100  1
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics