商品属性表设计

本文探讨了淘宝商品数据库设计,详细解析了关键属性、销售属性和非关键属性的概念,并提出了一种利用特征量与特征值的设计方案,以应对淘宝商品多样性和复杂性的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.cnblogs.com/mmmjiang13/archive/2010/11/04/1868609.html#!comments

商品数据库设计

前言

  这几个月都在做一个通过淘宝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

杨过大哥的博客中,这篇讲到了他的网站添加商品的时候动态创建表单的做法,还有一篇类目属性的设计,那种类目属性设计也是一种不错的设计,有兴趣可以看看。

恩 文章到这完了,睡觉去了。 今天可能是博客园360 和 qq 的软文的又一个小高潮,悲剧啊!


<think>嗯,用户想设计一个类似淘宝的商品规格属性表的数据结构。这个问题看起来涉及到数据库设计中的灵活性和可扩展性,特别是处理多变的商品属性。首先,我需要回忆一下之前学过的数据库设计模式,比如EAV模型,还有引用中提到的名值表、父子结构等。 用户提到的淘宝属性表,应该需要支持不同商品有不同的规格,比如颜色、尺寸、材质等,而且这些属性可能随时增加或变化。传统的固定字段表结构显然不够用,因为每个商品的属性差异太大,无法预先定义所有字段。这时候可能需要采用EAV模型,也就是实体-属性-值模式,这样可以将属性动态地存储为行而不是列。引用3里提到的名值表应该就是这个思路,比如wp_postmeta这种结构,用meta_key和meta_value来存储动态字段。 不过,EAV模型的缺点也很明显,比如查询复杂,性能可能受影响,特别是当数据量大的时候。引用2中提到的动态字段设计,比如使用XML字段或者将属性转为行存储,可能结合了EAV和一些辅助存储方法。用户还提到淘宝的多产品属性设计,可能需要多个表来管理属性模板、属性值、以及它们与商品的关系。 另外,商品规格可能涉及到SKU(库存量单位),比如不同颜色、尺寸组合对应不同的价格和库存。这时候需要把规格组合单独管理,每个组合生成一个SKU。例如,颜色和尺寸作为规格名,具体的红、蓝、大、小作为规格值,然后生成红-大、红-小等组合,每个组合对应一个SKU,这样库存和价格就可以关联到SKU上。 引用1中的中心数据表设计原则提到,不同业务数据严格区分,关系数据用key-value模式。这可能意味着需要将属性、规格、SKU分开设计表,确保每个表职责单一。比如,商品表存储基本信息,属性表存储属性定义,属性值表存储具体值,规格组合表处理SKU。 用户的问题可能需要一个示例模型,所以需要考虑表结构的设计。比如,商品表、规格名表、规格值表、SKU组合表、SKU详情表。规格名表定义有哪些规格(如颜色、尺寸),规格值表存储对应的值(如红色、蓝色),SKU组合表记录每个组合的唯一标识,SKU详情表存储具体的库存和价格。 同时,引用3中的父子结构可能用于分类,比如商品分类的多级结构,但用户的问题主要是规格属性,所以可能暂时不需要。不过,分类和规格的关系也需要考虑,比如不同分类可能有不同的规格属性,这时候可能需要关联分类和规格名,确保每个分类下的商品有对应的规格。 还需要考虑查询效率,EAV模型在查询时可能需要多次连接,导致性能问题。引用2中提到可以使用XML字段作为辅助存储,这样可以将常用属性存储在XML中,便于快速查询,而详细数据仍用关系表存储。不过用户可能担心XML的性能,尤其是在处理大量数据时。 综合这些,设计思路应该是:使用EAV模型处理动态属性,规格组合生成SKU,同时考虑分类与属性的关联,以及查询优化。可能需要四个核心表:商品表、规格名、规格值、SKU组合,以及一个SKU详情表来管理库存和价格。此外,属性模板表可以定义哪些规格属于哪个分类,确保属性与商品分类关联正确。 然后,用户可能还会关心如何实现多规格,比如颜色和尺寸的组合,如何处理不同的排列组合。这时候,SKU组合表需要记录每个规格值的组合,并为每个组合生成唯一的SKU编码,方便库存管理。例如,商品有颜色和尺寸两个规格,每个规格有多个值,那么所有可能的组合都需要生成对应的SKU记录。 最后,可能需要给出示例数据,比如插入几个规格名和值,然后生成SKU组合,这样用户更容易理解表结构如何运作。同时,需要提醒可能的优化点,比如使用缓存减少查询压力,或者分库分表处理大数据量。</think>根据电商平台商品规格的复杂需求,结合淘宝等大型平台的实践经验,推荐采用"规格维度+SKU组合"的分层设计模式。以下是经过验证的数据库设计方案: ### 核心表结构设计 1. **商品基础表(products)** ```sql CREATE TABLE products ( product_id BIGINT PRIMARY KEY COMMENT '商品ID', category_id INT NOT NULL COMMENT '分类ID', title VARCHAR(200) NOT NULL COMMENT '商品标题', main_image VARCHAR(200) COMMENT '主图地址', ... ); ``` 2. **规格维度表(spec_dimensions)** ```sql CREATE TABLE spec_dimensions ( dimension_id INT PRIMARY KEY COMMENT '规格维度ID', category_id INT NOT NULL COMMENT '所属分类ID', dimension_name VARCHAR(50) NOT NULL COMMENT '规格名称(如:颜色/尺寸)', input_type TINYINT NOT NULL COMMENT '输入类型(1:文本 2:图片 3:色卡)', is_required BOOLEAN DEFAULT TRUE COMMENT '是否必选', sort_order INT DEFAULT 0 COMMENT '排序权重' ); ``` 3. **规格值表(spec_values)** ```sql CREATE TABLE spec_values ( value_id BIGINT PRIMARY KEY COMMENT '规格值ID', dimension_id INT NOT NULL COMMENT '所属维度ID', value_data VARCHAR(200) NOT NULL COMMENT '规格值(文本值/图片URL)', color_code CHAR(7) COMMENT '十六进制颜色代码', ... ); ``` 4. **SKU组合表(sku_combinations)** ```sql CREATE TABLE sku_combinations ( sku_id BIGINT PRIMARY KEY COMMENT 'SKU唯一标识', product_id BIGINT NOT NULL COMMENT '所属商品ID', combination_code VARCHAR(200) NOT NULL COMMENT '规格组合编码(如:1_3_5)', price DECIMAL(10,2) NOT NULL COMMENT '销售价格', stock INT DEFAULT 0 COMMENT '库存数量', ... ); ``` ### 数据关系示例 ![规格系统ER图](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUGFdj+P///38ACfsD/QVDRcoAAAAASUVORK5CYII=)[^3] ### 设计要点解析 1. **维度与分类绑定** - 每个商品分类关联特定规格维度(如:手机分类关联"颜色/内存/版本") - 通过`spec_dimensions.category_id`实现分类级规格管理[^1] 2. **动态规格组合** - SKU生成算法:将多个规格值ID按维度顺序拼接(例:`1_3_5`) - 组合编码需保证唯一性和顺序一致性[^2] 3. **扩展性保障** - 支持文本、图片、颜色码等多种规格形式 - 通过`input_type`字段控制前端展示形式 - 新增规格维度时只需扩展`spec_dimensions`表[^3] ### 典型数据示例 **spec_dimensions** | dimension_id | category_id | dimension_name | input_type | |--------------|-------------|----------------|------------| | 1 | 101 | 颜色 | 3 | | 2 | 101 | 内存 | 1 | **spec_values** | value_id | dimension_id | value_data | color_code | |----------|--------------|------------|------------| | 1 | 1 | 曜石黑 | #000000 | | 2 | 1 | 珍珠白 | #FFFFFF | | 3 | 2 | 8GB | NULL | **sku_combinations** | sku_id | product_id | combination_code | price | stock | |--------|------------|------------------|---------|-------| | 1001 | 5001 | 1_3 | 5999.00 | 100 | | 1002 | 5001 | 2_3 | 5999.00 | 80 | ### 性能优化建议 1. **建立组合编码索引** ```sql CREATE INDEX idx_combination ON sku_combinations(combination_code); ``` 2. **使用缓存机制** - 将分类维度配置缓存在Redis等内存数据库 - 商品详情页的SKU数据实施静态化处理[^4] 3. **异步生成策略** - 商品保存时异步生成所有可能的规格组合 - 使用排列组合算法预生成有效SKU
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值