淘宝的电商产品种类非常丰富,必然得力于其商品模型的高度通用性和扩展性。

下面我将亲自操作淘宝商品的发布过程,结合网上其他博客对淘宝网商品库的分析,简单谈谈我的理解。

注:下面不特殊说明,各个表除主键外的无需建立其他唯一索引。

品类

在淘宝网发布宝贝,需要先选择所属的品类:

我要卖的商品,属于『流行男装 -> 帆布鞋 -> YINGLUNKUANGWEI/英伦匡威 』这个品类。可见,品类存在层级关系,流行男装是帆布鞋的父品类,英伦匡威属于帆布鞋的子品类,同时英伦匡威也是一个品牌。

撇开品牌不谈,维护这样一个品类关系,应该有这样一个表结构:

品类ID 主键
父品类ID 父级品类ID
品类名称 例如:帆布鞋
品类权重 上图每一列展示有次序先后之分

商品

选好品类好,点击编辑宝贝,最上面是这样的:

也就是说,你要编辑一个商品的名称和描述,并且商品属于一个分类,因此商品表大概如此:

商品ID 主键
品类ID 最子品类,比如:衣服->毛衣,那么这里应该是毛衣品类ID
标题 例如:一个YY出来的匡威鞋
描述 例如:买不了吃亏,买不了上当

属性和属性值

宝贝属性部分,淘宝规定了若干必填项和选填项,其中必填项一般用来商品检索用途,比如进入检索页可以看到"鞋帮高度"和"闭合方式"的筛选项:

我们知道,淘宝售卖各式各样的商品,需要支持各式各样的属性信息,比如:尺寸,颜色...等等。同样的道理,单单就颜色这个属性来说,其对应的属性值也可能是:绿色,红色...等等。

因此,我们可以用属性表存储属性,用属性值表存储与属性相关联的可选值,例如下面:

属性表

属性ID 主键
属性名称 例如:颜色

属性值表

属性值ID 主键
所属的属性ID 例如:归属于 颜色 属性
属性值  例如:红色

有这两个表之后,可以找一个运营人员小C专门负责接属性&属性值的增删改查需求,比如:

负责鞋品类的运营小A找小C说:颜色下面给我加一个彩虹色。

负责车品类的运营小B找小C说:颜色下面给我加一个蓝色。

在小C编辑完成后,小A可以给自己的品类引入:颜色 -> 彩虹色的选项,小B可以给自己的品类引入:颜色->蓝色的选项。

上面这段工作场景,其实引申出了接下来要谈到的另一个关键点,就是品类和属性&属性值的关系。

品类和属性&属性值

前面我们谈到小C的工作职责,是接小A和小B的需求,其中小A负责鞋品类,小B负责车品类。现在小C维护的数据中,颜色属性有2个值:彩虹色,蓝色,但是小A的品类只需要彩虹色,小B的品类只需要蓝色,如果他们俩去查询小C的属性值库会得到彩虹色,蓝色两个选项,这将导致一个淘宝卖家在编辑一辆汽车的时候可以选择彩虹色,可是我还没见过汽车是彩虹色喷漆的呢!

问题就在于,小C维护的是整个淘宝所有的属性与属性值,而小A和小B需要的仅仅所有属性中的部分,以及属性对应的属性值中的部分,因此我们需要维护一个"品类"与"属性","属性值"之间的关系,从而形成一个子集。

我们先建一个"品类属性"关系表,来标明某个品类关联到哪些属性子集合

品类属性模板ID 主键
品类ID 例如:帆布鞋的 品类ID
属性ID 例如:颜色的 属性ID
是否必填 之前的图片里,带*号的属性

再来建一个"品类属性值"关系表,来标明某个品类某个属性关联到哪些属性值子集合:

品类属性模板ID  例如:上面那个表的主键
属性值ID  例如:蓝色 的属性值ID

经过这样的设计,我通过先选择品类,就可以通过品类ID查询上述2个表得到属性子集合和属性值子集合,也就是最上面看到的各种"宝贝属性"的数据来源了。

PS:品类属性模板表没有对"品类ID+属性ID"做唯一性限制,这是出于真实运营场景下灵活性的考虑,同一时刻相同"品类ID+属性ID"应该只有一条记录处于有效状态,运营可以灵活的切换,这是程序来保障的,当然运营同学也不应该留存太多用不到的品类属性模板。

另外提一下,因为品类有父子关系,所以通常子品类会继承父品类的品类属性与品类属性值,这个不是关注的重点。

SKU

上面勾选的这些属性,其实都是为了描述商品的一些特性,然而我们在实际购买的时候其实并不是购买商品自身,而是购买一个SKU,那么SKU是什么?和商品是什么关系?

继续之前的编辑页面,向下滚动进入这个区域:这里是编辑宝贝的规格,这里的规格其实背后对应的就是SKU的概念

详细来说:

  • 颜色分类和尺码是2个品类属性,它们和之前勾选的其他属性相比,数据来源一样,但是用途不同,这个后面会说。
  • 选颜色时候,黑色和柠檬黄是2个品类属性值,选尺码的时候48.5和49.5是品类属性值。

经过程序的排列组合,产生了如下几种组合关系:

这里将颜色和尺码组合后,产生了4行记录,每一行记录就称作一个SKU,在购买时的效果我们应该很熟悉:

每一种尺码和颜色的组合选定之后,价格等信息都随之变动,这就是选择了一个SKU,也就是我们真实购买的东西,因此尺码和颜色分类这两种属性我们也称为销售属性(应该给"品类属性"表添加一个"是否为销售属性"),也就是控制SKU选择的属性。

根据上面的分析,SKU首先应该属于一个商品,也就是上面的购买页面代表一个商品,上面的多选按钮可以指定一个SKU,商品和SKU之间有1:N的关系。

其次,SKU应该与属性以及属性值有关联,比如:37码-绿色,39码-咖啡色,也就说:"尺码属性:37码,颜色分类:绿色"以及"尺码属性:39码,颜色属性:咖啡色"。

SKU表

SKU ID 主键
商品ID 所属的商品ID,例如:静熙男士帆布鞋 的商品ID
价格 SKU的售价

SKU销售属性表(也可以打包放在sku表的一个字段里)

SKU ID 联合主键 一个SKU一个属性只能对应一个值
属性ID
属性值ID    

库存

库存系统本身是个独立于商品库外的系统,通常要求较高的处理能力,这里仅说明库存应该与SKU关联:

SKU ID 主键
剩余库存 例如:10个

说在最后

既然一个商品库,需要维护那么多表,那么表之间的一致性就是很大的问题。

举几个例子:

  • 新建商品:正常来说应该保存1个商品记录,4个sku记录,4个库存记录,以及若干其他表的信息,如果开启数据库事务可以保证要么都成功,要么都失败。但是我们知道淘宝这种规模一定是分布式的mysql部署,另外,商品和库存是2个系统,一般也不会共享数据库,这些都导致单机事务的做法是行不通的。通常来说,都是考虑最终一致性,或者说不一致不会导致错误,比如:先插入库存记录,再插入sku记录,最后插入商品记录,这样就算前一步失败也可以保证用户搜索不到商品,不会导致致命错误。
  • 修改商品:修改商品,除了改商品自身的描述信息,还可能对sku进行增删改查。如果一个商品2个人同时改,那么有可能导致2个人提交瞬间,请求各种交错,谁都得不到想要的结果,因此一般可以考虑用数据库锁住商品记录,然后对sku信息进行独占的查询与修改,这样可以保证2个人串行生效,任何一方提交时发现现在的数据在编辑期间发生了变化,都可以回滚事务,重新查询最新状态。

另外,我们也不应该执行数据库的delete命令来删除属性,属性值,或者任何其他信息,因为极有可能已有商品对其产生了依赖,必须采用逻辑删除,也就是标记删除的方法,保证已有商品就算依赖了删除的属性也可以正常售卖,直到商家主动的重新编辑商品时重新选择商品的属性即可。


如果喜欢,请关注我。

转载于:https://www.cnblogs.com/qq120848369/p/6149578.html

YY一下淘宝商品模型相关推荐

  1. 淘宝商品详情平台化思考与实践

    淘宝商品详情平台化思考与实践 该文章来自阿里巴巴技术协会(ATA)精选集,(部份整理自<Detail2.0总体方案-20140818>) 1.    现状背景 Detail当前的问题可参见 ...

  2. python爬虫学习(三):使用re库爬取淘宝商品,并把结果写进txt文件

    第二个例子是使用requests库+re库爬取淘宝搜索商品页面的商品信息 (1)分析网页源码 打开淘宝,输入关键字"python",然后搜索,显示如下搜索结果 从url连接中可以得 ...

  3. [Python3网络爬虫开发实战] 7-动态渲染页面爬取-4-使用Selenium爬取淘宝商品

    在前一章中,我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过Ajax获取的,但是这些Ajax接口参数比较复杂,可 ...

  4. 爬取京东淘宝商品销量并可视化处理数据

    目的:获取京东和淘宝的同一种手机型号的销量信息,获取三组,对比销量,并将数据可视化处理. 一.京东销量获取 如下面的例子: 京东销量: data-sku:对应下一个页面的productId defau ...

  5. 利用Selenium爬取淘宝商品信息

    文章来源:公众号-智能化IT系统. 一.  Selenium和PhantomJS介绍 Selenium是一个用于Web应用程序测试的工具,Selenium直接运行在浏览器中,就像真正的用户在操作一样. ...

  6. 淘宝商品库MySQL优化实践的学习

    淘宝商品库MySQL优化实践的学习 淘宝商品库是淘宝网最核心的数据库之一,采用MySQL主备集群的架构,特点是数据量大且增长速度快,读多写少,对安全性要求高,并发请求高.由于MySQL最初的设计不是用 ...

  7. 淘宝商品数据库设计的一些经验

    前言 这几个月都在做一个通过淘宝API线下管理淘宝店的系统,学习了很多东西,这里想对淘宝商品表设计用自己的想法表现出来,如果你觉得很扯淡,可以写下自己的看法.OK,切入正题. 淘宝的商品这块的复杂程度 ...

  8. 爬取淘宝商品信息selenium+pyquery+mongodb

    ''' 爬取淘宝商品信息,通过selenium获得渲染后的源码,pyquery解析,mongodb存储 '''from selenium import webdriver from selenium. ...

  9. Python 大数据分析 淘宝商品销量的关系

    我们在上一篇的时候已经将淘宝数据爬取下来了,但是并没有做数据分析.所以今天这篇文章就是教大家如何去分析数据,得出一些有用的结论! Python语言相比其他语言的优势在哪里?猪哥认为是数据分析和人工智能 ...

  10. Python爬虫淘宝商品详情页价格、类似数据

      在讲爬取淘宝详情页数据之前,先来介绍一款 Chrome 插件:Toggle JavaScript (它可以选择让网页是否显示 js 动态加载的内容),如下图所示: 当这个插件处于关闭状态时,待爬取 ...

最新文章

  1. 在线实时大数据平台Storm输入源共享试验
  2. php多图片上传并回显,如何用input标签和jquery实现多图片的上传和回显功能
  3. 错误:无法访问android.app.Activity 找不到android.app.Activity的类文件
  4. Servlet总结04——注意Servlet单实例的线程安全性
  5. Android root概念
  6. Redis五种数据结构
  7. 记一次 .NET 某流媒体独角兽 API 句柄泄漏分析
  8. iphone屏幕录制_iPhone怎么内录声音?怎么录制苹果手机内部声音?
  9. Spring Boot Cache之缓存
  10. matlab画圆的命令_matlab画半圆
  11. 互联网架构:屡试不爽的架构三马车
  12. 1000道Python题库系列分享四(40道)
  13. re模块中的非贪婪匹配
  14. android内存泄漏原因分析,Android 内存泄漏案例分析总结(Handler)
  15. 前端验证的Ajax框架——myAjax.js
  16. Windows:Win10 Dell笔记本禁用触摸板
  17. 加速器在模拟器中的尝试
  18. kelvin模型蠕变方程_开尔文模型.ppt
  19. Android Jetpack架构组件之Room
  20. 使用JAXB实现JAVA对象和XML字符串的互相转换

热门文章

  1. java时间的最大毫秒数是多少_一分钟等于多少毫秒 jAVA处理日期(Date)时间(Time)以及相关类的介绍...
  2. 思科视频会议系统+服务器,Cisco思科MCU5310视频会议系统服务器
  3. [Tushare] 通过复权因子计算前复权价格、后复权价格
  4. ESP32使用MLX90614红外测温传感器
  5. elasticSearch创建索引库、映射、文档
  6. python爬虫解决频繁访问_python爬虫防止IP被封的一些措施
  7. scratch编程植物大战僵尸教程(一)
  8. 【机器学习】6:K-近邻(KNN)算法实现手写数字识别的三种方法
  9. MySQL学习笔记(七)视图,触发器,事务,存储过程,函数,流程控制,索引
  10. shell脚本学习(二十八)——服务启动脚本的编写