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

640?wx_fmt=gif

前言

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

淘宝的商品这块的复杂程度,是我见过的电子商务网站中最复杂的,灵活性最高的.在看下文之前,先说一下在淘宝中的以下名词:关键属性,销售属性,非关键属性。如下图:

640?wx_fmt=jpeg

关键属性:能够确认唯一产品的属性,可以是一个,或者多个关键属性的组合,比如:相机的"品牌""型号"能确定唯一的产品,服装的"品牌""货号"能确定唯一的产品

销售属性:组成SKU的特殊属性,它会影响买家的购买和卖家的库存管理,如服装的"颜色"、"套餐"和"尺码",注意这里的SKU,淘宝销售属性组合成SKU

非关键属性:就是商品属性了,一些对商品进行描述的属性

特征量,特征值的设计

最初了解这种设计,是项目经理的指导,他瞅一眼数据结构之后立马说:典型的特征量对应特征值的设计。额,佩服。恩,看下下图这2个表的数据,就很清楚了,

640?wx_fmt=jpeg

在特征量这个表中,存放所有的例如:品牌,系列,颜色,尺码 这些名称,在特征值中存放具体的值,比如衣服有12种颜色,那么左表中有 ID:1, 名字:颜色,在右表中存放

黄色,绿色等等具体的值,特征量表是一个父子关系,比如有的品牌下面有系列,系列下面可能还有系列,右表的数据存在冗余是不可避免的,比如衣服有24个颜色,鞋有24个颜色,虽然特征值是一样,但是是属于不同的特征量的。

那么如上图所示,(注意,上图中特征量表我并没有添加父子关系,在设计的时候是有父子关系的)我要添加一个避孕套商品,最少分为2步,首先在类别表中选中计生用品-->一直到避孕套这个子分类,通过子分类的ID,级联查询特征量和特征值这个表,得到诸如品牌,大小,颜色这种属性,如果存在层级关系,比如品牌下面的系列,系列下面还可能有系列,通过特征量表中的父子关系,继续查询出来,当然,也可以通过类目ID一次性查询出来,然后进行关系显示。

对具有不同属性的同种商品做的不同价格,数量设计?

  640?wx_fmt=jpeg

我们看在淘宝中添加衣服和数码相机的情况,这里会出现选择"关键属性" 颜色+尺码之后,出现需要对不同颜色尺码的组合填写价格和数量和商家外部码,相机则是颜色+套餐+外部码,而到了洗发水就是容量+多买多便宜+外部码,这里就是上面介绍的SKU,如果你还不了解SKU,可以做下了解,这样子做的直接好处就是,不同的搭配可能有不同的价格,做库存和销量的统计的时候就能做到准确统计,通过商家的外部编码能让商家关联本地系统,也是为了做统计和库存的方便。

恩 大伙瞅瞅我的设计吧,要拍,请轻拍

2011-03-23 修正:这篇文章以我现在的理解来说,表设计存在问题!!请看到这里马上离开!你也可以关注我后续淘宝分析相关文章~

640?wx_fmt=jpeg

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字符串到页面,根据特征量中的是否是枚举,是否是父属性,是否关键属性,是否销售属性来动态创建页面表单,具体也可以看看淘宝添加产品的页面。

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

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

相关文章

AT2645 [ARC076D] Exhausted?(Hall定理推论/线段树+扫描线)

AT2645 [ARC076D] Exhausted? 对于一个二分图左边点连接的是右边点的一个前缀和一个后缀,求解最大匹配。 首先不能直接求解最大匹配,但是我们可以利用Hall定理的推论求解 ∣U∣−max(∣X∣−N(∣X∣))|U|-max(|X|-N(|X|))∣U∣−max(∣X∣−N(∣X∣))…

2019-03-11-算法-进化(搜索二维矩阵II)

题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性: 每行的元素从左到右升序排列每列的元素从上到下升序排列 示例: 现有矩阵 matrix 如下: [[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9…

A and B and Lecture Rooms

A and B and Lecture Rooms 题意要求我们找有多少个点iii满足dis(i,x),dis(i,y)dis(i, x), dis(i, y)dis(i,x),dis(i,y),输出点iii的数量即可。 首先特判无解的情况就是dis(x,y)dis(x, y)dis(x,y)为奇数时,接下来我们讨论有解的情况,大致分…

观星(计算几何/凸包/多边形面积)

观星 对于平面上有n个点分为三类&#xff0c;要求寻找一个三角形&#xff0c;三个顶点分别属于这三类&#xff0c;求解最大面积。 N<3000 首先考虑到O(n2)O(n^2)O(n2)的枚举&#xff0c;然后对于另外一种考虑这个点的位置&#xff0c;显然它应该在凸包上&#xff0c;因为我…

DevOps之持续集成SonarQube代码质量扫描

SonarQube是一个用于代码质量检测管理的开放平台&#xff0c;可以集成不同的检测工具&#xff0c;代码分析工具&#xff0c;以及持续集成工具。SonarQube 并不是简单地把不同的代码检查工具结果直接显示在 Web 页面上&#xff0c;而是通过不同的插件对这些结果进行再加工处理&a…

2019-03-12-算法-进化(合并两个有序数组)

题目描述 给定两个有序整数数组 nums1 和 nums2&#xff0c;将 nums2 合并到 nums1 中&#xff0c;使得 num1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n你可以假设 nums1 有足够的空间&#xff08;空间大小大于或等于 m n&#xff09;来保存…

网络流与线性规划24题(写了一半,先鸽下了……)

Network-flows Ford-Fulkerson算法 typedef long long ll;const int N 1e5 10;int head[N], to[N], nex[N], flow[N], cnt;int vis[N], n, m, s, t;void add(int x, int y, int w) {to[cnt] y;nex[cnt] head[x];flow[cnt] w;head[x] cnt; }ll dfs(int rt, ll now) {if(…

数字(进制/二分/组合数学)

数字 求解满足从n1到2n中有恰好m个数字含有k个1的n&#xff0c;并求出个数 首先看到二进制的问题&#xff0c;我们需要寻找性质&#xff0c;首先考虑n1和2n的性质&#xff0c;然后这道题中我们设f(n,k)表示n1到2n中的数字含k个1的个数。 然后考虑f(n1,k)f(n,k)[2n1含k个1]&am…

.NET CORE 怎么样从控制台中读取输入流

从Console.ReadList/Read 的源码中&#xff0c;可学习到.NET CORE 是怎么样来读取输入流。也可以学习到是如何使用P/Invoke来调用系统APIConsole.ReadList 的源码为[MethodImplAttribute(MethodImplOptions.NoInlining)]public static string ReadLine(){return In.ReadLine();…

变量(网络流模型)

变量 首先最终答案的形式一定是每个变量前面对应一个系数&#xff0c;然后加上一些绝对值&#xff0c;由于每个变量只有两种取法&#xff0c;所以我们考虑使用最小割处理&#xff0c;对于每个变量建一个点分别连到S和T&#xff0c;然后表示选择取哪个&#xff0c;然后会有一边是…

使用VS Code 开发.NET CORE 程序指南

1. 前言近两年来&#xff0c;很多前端的同学都开始将 VSCode 作为前端主力开发工具&#xff0c;其丰富的扩展给程序开发尤其是前端开发带来了很多便利&#xff0c;但是作为微软主力语言的 .NET&#xff0c;却由于有宇宙第一IDE Visual Studio存在&#xff0c;很少有看到有后端同…

珂朵莉树

珂朵莉树 简要 珂朵莉树的核心操作&#xff1a;split 实际很简单&#xff0c;一个集合中&#xff0c;有一部分需要修改&#xff0c;而另一部分不需要修改&#xff0c;就把集合拆开&#xff0c;拆成两部分。 珂朵莉树的推平操作&#xff1a;assign 珂朵莉树的复杂度是由ass…

2019-03-13-算法-进化(鸡蛋掉落)

题目描述 你将获得 K 个鸡蛋&#xff0c;并可以使用一栋从 1 到 N 共有 N 层楼的建筑。 每个蛋的功能都是一样的&#xff0c;如果一个蛋碎了&#xff0c;你就不能再把它掉下去。 你知道存在楼层 F &#xff0c;满足 0 < F < N 任何从高于 F 的楼层落下的鸡蛋都会碎&…

P3810 【模板】三维偏序(陌上花开)

P3810 【模板】三维偏序&#xff08;陌上花开&#xff09; cdq分治的模板题目&#xff0c;用cdq分治处理点对的问题&#xff0c;首先按照第一维排序&#xff0c;然后分治&#xff0c;这样就可以每次考虑二三维即可&#xff0c;然后就可以利用树状数组求解了&#xff0c;然后一…

用pythonnet为计算机视觉做图像整理

中国的.NETer是国内技术的另类&#xff0c;当他们强调.NET也可以做啥啥时都会给别的技术藐视&#xff0c;毕竟主流都不用.NET。本人这几年其实花在.NET时间也少&#xff0c;都投入在Python/Go社区。可我还是有点工作外的寄托&#xff0c;就是让.NET也有一个很好的推广&#xff…

ABP虚拟文件系统(VirtualFileSystem)实例------定制菜单栏显示用户姓名

ABP默认的MVC启动模板在登录后, 右上角显示的是用户名:如果想让它显示用户的姓名该如何做呢?这就需要用到ABP一个非常强大的功能------虚拟文件系统.前期准备使用ABP CLI创建一个名为AbpStudy的ASP.NET MVC项目:abp new AbpStudy关于MVC的启动模板可以看文档, 这里就不赘述.虚…

序列计数(动态规划/自动机/前缀和优化)

序列计数 对于一个小写字母的序列每次可以将相邻两个不同的小写字母都变为二者之一&#xff0c;可以进行无限次这样的操作&#xff0c;求解可以产生多少种不同的序列。 首先我们不能考虑操作&#xff0c;而是考虑合法序列&#xff0c;显然最后会形成若干个区间&#xff0c;然…

概率期望dp

概率期望 LOOPS dp[i][j]dp[i][j]dp[i][j]表示从i,ji, ji,j到r,cr, cr,c的期望&#xff0c;有dp[i][j]p0dp[i][j]p1dp[i][j1]p2dp[i1][j]2dp[i][j] p_0 \times dp[i][j] p_1 \times dp[i][j 1] p_2 \times dp[i 1][j] 2dp[i][j]p0​dp[i][j]p1​dp[i][j1]p2​dp[i1][j]2…

2019-03-13-算法-进化(验证回文串)

题目描述 给定一个字符串&#xff0c;验证它是否是回文串&#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。 说明&#xff1a;本题中&#xff0c;我们将空字符串定义为有效的回文串。 示例 1: 输入: "A man, a plan, a canal: Panama" 输出: t…

.NET中国峰会 参与意愿调查

2014年微软组织成立.NET基金会&#xff0c;微软在成为主要的开源参与者的道路上又前进了一步。2014年以来已经有众多知名公司加入.NET基金会, 仅在平台项目中&#xff0c;.NET平台上有87&#xff05;贡献者其实不在Microsoft工作。将.NET基金会变成一个更加多样化和成员驱动的组…