从淘宝数据结构来看电子商务中商品属性设计
淘宝名词解释
产品 和 商品的区别:
淘宝标准化产品,由类目+关键属性唯一确定。如:手机类目,关键属性是品牌和型号,Nokia N95就是一个产品,nokia是品牌,N95是型号。产品除了关键属性还包括一般信息、销售属性和非关键属性。参考:如"诺基亚N95"就是一个产品。通过类目的关键属性组合来确定唯一的产品。后台标准类目叶子节点下,一组共同特征商品的组合(例如:化妆品+雅芳+保湿单品+容量),属于同一个产品的商品可以认为对消费者的效用及使用感受是没有差别的。 产品这个概念对淘宝这种C2C,B2C的平台是需要的,对我们一般的电子商务平台基本是可以忽略的.
属性名和属性值:
这里非常重要了,淘宝的宝贝搜索页面,通过各种属性对商品进行搜索,全靠属性表了。从数据结构可以看到,属性名表和属性值值归属于类目,提取了类目子叶节点下面商品的公共基本属性,在淘宝中,品牌和系列也当成是类目的属性,可以看看这里来了解淘宝属性分类,这里看下图来了解属性名和属性值表之间的关系:
1.需要注意的是:左边的表中全部存放属性名,存在一个父子关系,比如品牌->型号->子型号,右边的属性值表只保存属性的值。
2.左表的属性名表有个parentVid字段,这边的属性名也跟右边的属性值相关联,比如宏基下面有‘宏基电脑的型号’,那么这个‘宏基电脑的型号’属性名存放于属性名表,
具体有多少个型号,型号的名称还是存放于属性值表
3.如何添加自定义属性,如何给属性起别名,可以参考淘宝API的输入属性
SKU:
在淘宝中,SKU指销售属性的组合,表示一组最小销售单位。 如颜色:金色;套餐:单电单充,描述手机销售时实物特征。比如衣服: 颜色:红色;尺码:xl;我们可以通过这样的属性标示来确定一个商品.注意:比如洗发水,容量:150ML;买的多便宜多:*6;比如相机:颜色:红色;套餐:A套餐;这种特殊的营销模式也是一个SKU,我们后面就必须通过这些组合成SKU的属性来统计销售,库存等信息,比如我们才能知道红色,XL的衣服卖了多少,绿色,L的衣服卖了多少.
注意:我们自己的电子商务中,是否需要这样的SKU设计,是需要的,不管你是用什么方法实现,但是根据属性统计销售等情况是电子商务中都会遇到的需求,但是有没有必要一定这样的实现,一件衣服,用户点击进来,才能看到SKU呢,没有必要的,其实做电子商务之后发现,图片,介绍,是给用户的第一直接感觉,所以,很多商家会把一个SKU的商品当一个独立的商品发布,比如衣服,红色的发布一个,蓝色的发布一个,这是完全有必要的,我们可以通过发布的多个SKU的单品,跳转到统一的页面让用户进行挑选,就比方说,你看了衣服A的黄颜色,衣服A的绿颜色,点击查看详情都是到一个页面,这样的话,为我们的商品提供更多次的展示,提高了用户的购买率;
品牌和系列:
在淘宝中,如:日化/清洁/护理->日化用品->洗发水->海飞丝->清爽去屑系列,海飞丝以及它的系列都被规制到属性当中,结构为:品牌:海飞丝;系列:XXXXX,这样的话,不管你新有什么品牌,你只要属于我的分类,那你就添加基本属性就可以了,特殊的属性是可以手动输入的。因为商品的属性是针对每一个分类的子叶节点的,这样的设计,在我们做电子商务中思考是否适合自己。
抓取属性
API文档:http://my.open.taobao.com/apidoc/index.htm#categoryId:3
API属性测试工具:http://open.taobao.com/api_tool/props/
SDK下载地址:http://open.taobao.com/bbs/read.php?tid=18008
抓取详细的代码不写了,需要注意的是,由于数据很大,需要多次连接API得到数据,必须做好异常记录,不然抓一次,发现失败了很多次,那么必须又开始一次了,我是把失败的ID保存于数据库之中
这样,抓完之后只要先删除这些抓取失败的,在来一次,就OK了。
通过属性来动态构建表单
1. 当用户选择完类目之后,我们已经可以通过类目ID得到类目下面所有的属性名和属性值,这里我们根据淘宝的添加商品页面分析淘宝是如何做的:
需要注意的是:淘宝属性这里的布局全是UL->LI的布局,这样的结构和CSS配合起来让JS实现起来是最容易的。
我们看到name=“keySpus”这里放置的关键属性,下面的所有LI中放置的是非关键属性,和用户自定义属性。我们通过什么来判断表单控件是select 还是checkboxlist,属性是什么类型的属性,属性下是否有子属性(品牌->系列->子系列),以及验证属性是否必填必选或者可自定义输入?请看属性的数据结构,is_key_prop,is_sale_prop,is_enum_prop,multi,must,child_template这些数据结构能告诉我们答案.
好吧,实现上面相对简单一点,实现销售属性就麻烦了,因为销售属性可以组合成多个SKU,怎么来实现呢?
上图的洗发水的“毫升”和“买的多便宜多”组合成一个SKU,显示在下面的tr里面,实现这里有一个很取巧的办法,先把所有能组合好的属性构造出来,页面上隐藏N个TR,用户点击毫升或者*6 *12这种,我们显示相应的TR组就好了 :) 其实是个好办法的,可以省掉考虑很多问题,页面最多增加10来K,JS性能也能提高不少.
如果你觉得这样的实现很困难或者很麻烦,推荐你看看nopecomerce开源项目的属性(它叫变体)实现.如图:
展示效果:
这样在多个页面的输入,减少了实现的难度,就是在后台有点麻烦。
好吧,这篇文章在护士MM的生活照中结束吧,欢迎大家讨论,以前写一篇分析淘宝商品设计的文章,不要去看.发现当时考虑问题没有考虑周全,后面有时间再写一篇.在前台实现快速的属性读取和页面展示,后台进行快速的报表展示,OLAP建模都需要考虑很多问题,也希望有经验的朋友能讨论个自是如何做的.
2011-04-22 追加 属性名表和属性值表关系图示
1.通过类目ID得到类目下面的所有属性值
2.通过类目ID+品牌ID(20000)得到洗发水的所有品牌
3.通过父VID+父PID+类目ID 得到美吾发洗发水品牌下的3个型号
在图1这里型号可以叫做'美吾发型号' '飘柔型号',属性名表和属性表存在相互引用关系,这里我们自己做的话也可以加上第3个表来存储关系。
YY淘宝商品数据库设计
前言
这几个月都在做一个通过淘宝API线下管理淘宝店的系统,学习了很多东西,这里想对淘宝商品表设计用自己的想法表现出来,如果你觉得很扯淡,可以写下自己的看法.OK,切入正题.
淘宝的商品这块的复杂程度,是我见过的电子商务网站中最复杂的,灵活性最高的.在看下文之前,先说一下在淘宝中的以下名词:关键属性,销售属性,非关键属性。如下图:
关键属性:能够确认唯一产品的属性,可以是一个,或者多个关键属性的组合,比如:相机的"品牌""型号"能确定唯一的产品,服装的"品牌""货号"能确定唯一的产品
销售属性:组成SKU的特殊属性,它会影响买家的购买和卖家的库存管理,如服装的"颜色"、"套餐"和"尺码",注意这里的SKU,淘宝销售属性组合成SKU
非关键属性:就是商品属性了,一些对商品进行描述的属性
特征量,特征值的设计
最初了解这种设计,是项目经理的指导,他瞅一眼数据结构之后立马说:典型的特征量对应特征值的设计。额,佩服。恩,看下下图这2个表的数据,就很清楚了,
在特征量这个表中,存放所有的例如:品牌,系列,颜色,尺码 这些名称,在特征值中存放具体的值,比如衣服有12种颜色,那么左表中有 ID:1, 名字:颜色,在右表中存放
黄色,绿色等等具体的值,特征量表是一个父子关系,比如有的品牌下面有系列,系列下面可能还有系列,右表的数据存在冗余是不可避免的,比如衣服有24个颜色,鞋有24个颜色,虽然特征值是一样,但是是属于不同的特征量的。
那么如上图所示,(注意,上图中特征量表我并没有添加父子关系,在设计的时候是有父子关系的)我要添加一个避孕套商品,最少分为2步,首先在类别表中选中计生用品-->一直到避孕套这个子分类,通过子分类的ID,级联查询特征量和特征值这个表,得到诸如品牌,大小,颜色这种属性,如果存在层级关系,比如品牌下面的系列,系列下面还可能有系列,通过特征量表中的父子关系,继续查询出来,当然,也可以通过类目ID一次性查询出来,然后进行关系显示。
对具有不同属性的同种商品做的不同价格,数量设计?
我们看在淘宝中添加衣服和数码相机的情况,这里会出现选择"关键属性" 颜色+尺码之后,出现需要对不同颜色尺码的组合填写价格和数量和商家外部码,相机则是颜色+套餐+外部码,而到了洗发水就是容量+多买多便宜+外部码,这里就是上面介绍的SKU,如果你还不了解SKU,可以做下了解,这样子做的直接好处就是,不同的搭配可能有不同的价格,做库存和销量的统计的时候就能做到准确统计,通过商家的外部编码能让商家关联本地系统,也是为了做统计和库存的方便。
恩 大伙瞅瞅我的设计吧,要拍,请轻拍
2011-03-23 修正:这篇文章以我现在的理解来说,表设计存在问题!!请看到这里马上离开!你也可以关注我后续淘宝分析相关文章~
1.类目和特征量,特征量和特征值并不是多对多的关系,是一对多的关系
2.类目和特征量都是父子表
3.商品的关键属性如:品牌 系列(只存放子及ID),其它属性,比如说裤子的裤型,适合人群,等属性存入基本属性表,这里品牌系列只存放子及ID是因为考虑到,不想建立过多的表,用户搜索用例如lunce把全部信息建好索引,做统计或者数据分析的时候也是可以通过父子特征量的父子关系进行的。
4.销售属性的分开是因为,比如洗发水,我们的特征值表中的值可能不能符合用户需求,那么可以让用户自定义值,颜色可以上传图片等,而且销售属性一般为多个组合,所以单独建立一个表。
5.商品的SKU表,这个特征量ID的组合实际上就是销售属性表的ID组合
当我们添加一个商品的时候,在不考虑页面展现的情况下需要这几步:
1.插入商品基本信息到商品表
2.插入基本属性和关键属性到商品基本属性表
3.插入销售属性到销售属性表
4.插入销售属性ID组合,数量,价格等到商品SKU表。
当我们在页面上展示商品的时候:
1.级联6个表查询出商品所需要的信息,由于关键属性有多级,这里只存了子及,需要做一次递归。当然可以考虑缓存等自己的实现方法
2.分析商品SKU组合,生成销售属性组合及约束,比如颜色+尺码 选择之后的不同价格,是否还有货。颜色有图片的用上传的图片代替默认背景
难点在于:
1.页面的展现不管前台还是后台都必须动态构建,在动态构建的基础上加上基本的验证,比如用户选择了 颜色A+尺码,库存只有3件,数量填写了5,必要提示用户没有了这么多数量,动态构建中还存在某些属性有层级关系,需要按照自己的策略选择一次性加载或者AJAX加载,进行分析显示
2.几个表关联查询的设计,何种方法能最大化减小程序的复杂程度,是直接在数据库中搞定,还是数据库结合内存表(缓存特征量和特征值).
页面上的展现和其它设计
我在实际项目中添加商品的做法是,序列化属性成json字符串到页面,根据特征量中的是否是枚举,是否是父属性,是否关键属性,是否销售属性来动态创建页面表单,效果如他的API页面,如果你有兴趣,可以参考他的JS
在杨过大哥的博客中,这篇讲到了他的网站添加商品的时候动态创建表单的做法,还有一篇类目属性的设计,那种类目属性设计也是一种不错的设计,有兴趣可以看看。