从淘宝数据结构来看电子商务中商品属性设计

淘宝名词解释

产品 和 商品的区别:

淘宝标准化产品,由类目+关键属性唯一确定。如:手机类目,关键属性是品牌和型号,Nokia N95就是一个产品,nokia是品牌,N95是型号。产品除了关键属性还包括一般信息、销售属性和非关键属性。参考:如"诺基亚N95"就是一个产品。通过类目的关键属性组合来确定唯一的产品。后台标准类目叶子节点下,一组共同特征商品的组合(例如:化妆品+雅芳+保湿单品+容量),属于同一个产品的商品可以认为对消费者的效用及使用感受是没有差别的。 产品这个概念对淘宝这种C2C,B2C的平台是需要的,对我们一般的电子商务平台基本是可以忽略的.

属性名和属性值:  

这里非常重要了,淘宝的宝贝搜索页面,通过各种属性对商品进行搜索,全靠属性表了。从数据结构可以看到,属性名表和属性值值归属于类目,提取了类目子叶节点下面商品的公共基本属性,在淘宝中,品牌和系列也当成是类目的属性,可以看看这里来了解淘宝属性分类,这里看下图来了解属性名和属性值表之间的关系:

 
2011041916121076.jpg2011041916122859.jpg

1.需要注意的是:左边的表中全部存放属性名,存在一个父子关系,比如品牌->型号->子型号,右边的属性值表只保存属性的值。

2.左表的属性名表有个parentVid字段,这边的属性名也跟右边的属性值相关联,比如宏基下面有‘宏基电脑的型号’,那么这个‘宏基电脑的型号’属性名存放于属性名表,

具体有多少个型号,型号的名称还是存放于属性值表

3.如何添加自定义属性,如何给属性起别名,可以参考淘宝API的输入属性

SKU:

  2011041917185890.jpg2011041917195429.jpg
  在淘宝中,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保存于数据库之中

2011041916580295.jpg

这样,抓完之后只要先删除这些抓取失败的,在来一次,就OK了。

通过属性来动态构建表单

1. 当用户选择完类目之后,我们已经可以通过类目ID得到类目下面所有的属性名和属性值,这里我们根据淘宝的添加商品页面分析淘宝是如何做的:

2011042023304478.png

需要注意的是:淘宝属性这里的布局全是UL->LI的布局,这样的结构和CSS配合起来让JS实现起来是最容易的。

我们看到name=“keySpus”这里放置的关键属性,下面的所有LI中放置的是非关键属性,和用户自定义属性。我们通过什么来判断表单控件是select 还是checkboxlist,属性是什么类型的属性,属性下是否有子属性(品牌->系列->子系列),以及验证属性是否必填必选或者可自定义输入?请看属性的数据结构,is_key_prop,is_sale_prop,is_enum_prop,multi,must,child_template这些数据结构能告诉我们答案.

好吧,实现上面相对简单一点,实现销售属性就麻烦了,因为销售属性可以组合成多个SKU,怎么来实现呢?

2011042023494318.png

上图的洗发水的“毫升”和“买的多便宜多”组合成一个SKU,显示在下面的tr里面,实现这里有一个很取巧的办法,先把所有能组合好的属性构造出来,页面上隐藏N个TR,用户点击毫升或者*6 *12这种,我们显示相应的TR组就好了 :) 其实是个好办法的,可以省掉考虑很多问题,页面最多增加10来K,JS性能也能提高不少.

如果你觉得这样的实现很困难或者很麻烦,推荐你看看nopecomerce开源项目的属性(它叫变体)实现.如图:

2011042100260868.gif

展示效果:

2011042100274391.jpg

这样在多个页面的输入,减少了实现的难度,就是在后台有点麻烦。

好吧,这篇文章在护士MM的生活照中结束吧,欢迎大家讨论,以前写一篇分析淘宝商品设计的文章,不要去看.发现当时考虑问题没有考虑周全,后面有时间再写一篇.在前台实现快速的属性读取和页面展示,后台进行快速的报表展示,OLAP建模都需要考虑很多问题,也希望有经验的朋友能讨论个自是如何做的.

2011-04-22 追加  属性名表和属性值表关系图示

2011042214160164.jpg

1.通过类目ID得到类目下面的所有属性值

2.通过类目ID+品牌ID(20000)得到洗发水的所有品牌

3.通过父VID+父PID+类目ID 得到美吾发洗发水品牌下的3个型号

在图1这里型号可以叫做'美吾发型号' '飘柔型号',属性名表和属性表存在相互引用关系,这里我们自己做的话也可以加上第3个表来存储关系。

转载于:https://www.cnblogs.com/mmmjiang13/archive/2011/04/21/1983079.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux串口驱动分析

linux串口驱动分析硬件资源及描述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)端口,每个端口都可以在中断模式或 DMA 模式下操作。UART 使用系统时钟可以支持最高 115.2Kbps 的波特率。每…

Linux 进程通信 -- 信号

一、概述 信号用于保持进程间的通信,可以备发送到一个进程或者一组进程,发送给进程的这个唯一信息通常是标志信号的一个数。信号可从键盘终端产生、虚拟内存中非法访问系统资源等情况下产生。信号异步发生,收到信号的进程可以采取某种动作或…

简单理解Socket

TCP/IP 要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准&…

write() vs. writev()

From: http://www.cppblog.com/whoami17/archive/2009/05/10/82452.html 今天突然想比较一下 write() 和 writev() 的性能, 网上google了半天, 竟然没有发现一点有关的数据信息, 自己就测试了一下。 平台如下: CentOS 5.2 Lin…

linux下GPRS模块ppp拨号上网

交叉编译器:arm-linux-gcc-4.5.4 Linux内核版本:Linux-3.0 主机操作系统:Centos 6.5 开发板:FL2440 GPRS:SIM900A 在开发SIM900模块之前,开发板已经加载了linux内核以及文件系统&#xf…

高级I/O(七)--readv和writev函数

From: http://blog.chinaunix.net/uid-26822401-id-3158225.html readv和write函数让我们在单个函数调用里从多个不连续的缓冲里读入或写出。这些操作被称为分散读&#xff08;scatter read&#xff09;和集合写&#xff08;gather write&#xff09;。 #include <sys/uio…

Linux下如何定位Java进程CPU利用率过高原因

首先通过Top命令查看占用CPU较高的进程PID&#xff0c;执行Top之后按1可以查看每个核占用比例 1 top这里由于我是用的虚拟机&#xff0c;即使我的Java进程占用CPU很高也只是占的虚拟机的&#xff0c;而对整个机器的CPU来说占的并不高。这里我们找到了pid7957 然后我们在根据pi…

【iOS开发】企业版证书($299)In-House方式发布指南

一、明确几个概念 1、企业版IDP&#xff1a;即iOS Development Enterprise Program。注意是$299&#xff0f;Year那种&#xff0c;并不是$99/Year的那种。 2、In House&#xff1a;是只企业内部发布&#xff0c;仅限企业内部人员使用。 二、In-House方式特点 1、不能发布到Appl…

RMSE、MAPE、准确率、召回率、F1、ROC、AUC总结

RMSE(root mean square error)均方根误差 单纯统计误差的值。 MAPE(mean absolute percentage error) 平均百分比误差 存在一个和原始数据相比较的过程。 准确率&#xff08;precision&#xff09;P&#xff1a; PTP/(TPFP) TP(true positive) FP(false positive) P是代表预…

hdu 5317 RGCDQ (2015多校第三场第2题)素数打表+前缀和相减求后缀(DP)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid5317 题意&#xff1a;F(x) 表示x的不同质因子的个数结果是求L&#xff0c;R区间中最大的gcd( F(i) , F(j) )&#xff0c;i、j在L&#xff0c;R区间内。 思路&#xff1a;因为2<L < R<1000000&#xf…

MATLAB 中RMSE和MAPE的计算方法

RMSE&#xff1a;均方根误差 matlab计算方法&#xff1a; rmse sqrt(mean((YPred-Obverval).^2)); MAPE&#xff1a;平均百分比误差 matlab计算方法&#xff1a; meap mean(abs((observed - predicted)./observed))*100;

shell 基本知识

shell--脚本基础知识 ****shell 脚本基础知识**** 一、基本脚本编译 知识内容&#xff1a; # 构建脚本 # 将命令串联起来 # 存储变量 # 数学计算 # 重定向输出 # 检查代码shell不像高级语言需要编译后执行&#xff0c;而是直接处理每一条命令&#xff0c;可以将多条命令连接起来…

让LwIP拥有PING其他设备的能力

LwIP是个很不错的协议栈&#xff0c;但是由于其体积过于小巧&#xff0c;使其只能支持ICMP的ECHO类型。 因为在“icmp.c”中的“void icmp_input(struct pbuf *p, struct netif *inp)”函数里有个很长的switch case语句&#xff08;大约80行的位置&#xff09;。 而这个语句只…

H.264详解

From: http://netliuwei.blog.163.com/blog/static/93642191201111721931583/ H.264 H.264&#xff0c;同时也是MPEG-4第十部分&#xff0c;是由ITU-T视频编码专家组&#xff08;VCEG&#xff09;和ISO/IEC动态图像专家组&#xff08;MPEG&#xff09;联合组成的联合视频组&…

VSCode中配置prettier和ESLint

文章目录 了解ESLint和Prettier的作用prettier配置ESLint配置常见问答ESLint 和Prettier 有什么区别&#xff1f;为什么我应该同时使用ESLint 和Prettier&#xff1f;在使用ESLint 和Prettier 时&#xff0c;有可能出现它们之间的规则冲突吗&#xff1f;我已经在项目中使用了ES…

Lwip使用经验

LWIP使用经验 一 LWIP内存管理 数据包管理 设置内存大小 宏编译开关 二 LWIP启动时序 三 LWIP运行逻辑 接收数据包 SequentialAPI函数调用 四 TCPIP核心知识点 滑动窗口 三次握手 断开连接 TCP状态转换 同时打开 同时关闭 五正确使用LWIP 六 LWIP常见问题 网卡驱动程序 内存…

Keil5 编译生成bin二进制文件的设置方法

勾选&#xff1a;After Build/Rebuild Run #1 代码&#xff1a;fromelf --bin .\output\node.axf --output .\output\NoiseApp.bin 解释&#xff1a; .\ 指当前工程文件.uvprojx所在的目录.\output\node.axf 表示给定axf所在的位置.\output\NoiseApp.bin 表示bin文件输出的…

在word中插入代码段的方法[转]

废话不多说&#xff0c;下面说明实现步骤 步骤一 1.打开这个代码高亮工具网站&#xff1a;http://www.planetb.ca/syntax-highlight-word 2.在代码框中粘贴代码&#xff0c;选择语言&#xff0c;点击Show Highlighted 3.复制生成的代码段 步骤二 4.在 Microsoft Word…

开源好用的思维导图软件XMind

作为一款免费开源的思维导图制作编辑软件&#xff0c;灵活的运用思维导图会让你在学习和工作上帮助甚大。 接下来我们除了介绍思维导图之外&#xff0c;还给大家介绍一款免费的思维导图制作软件 XMind&#xff0c;它能支持 Windows、Mac、Linux 主流操作系统&#xff0c;而且还…

STM32到GD32移植攻略

1、 系统 1) 晶振起振区别 描述&#xff1a;启动时间&#xff0c;GD32 与STM32 启动时间都是2ms&#xff0c;实际上GD 的执行效率快&#xff0c;所以ST 的HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)是2ms&#xff0c;但是这个宏定义值在GD 上时间就更加短了&#xff0c;所以要加大…