关于电商网站数据库的设计?

我在思考一个问题,电商网站的数据库设计,主要是商品分类,商品的详情(不同的商品有不同的熟悉,比如衣服有颜色、尺码,然而电脑有CPU、内存、显卡等规格)…
关注者
716
被浏览
296,165

14 个回答

2021.02.04更新:有朋友说要看数据库设计的源码,我自己没有,但是目前有两个很牛逼的完整的开源方案,有需要的可以直接看:

xmall:github.com/Exrick/xmall

litemall:github.com/linlinjava/l

============================原答案======================

这个问题的核心点在于:不同商品类别差异很大,如何设计通用的存储方案
简单来说,用数据库去存储所有信息,不管横表还是纵表,都有明显的缺陷:
横表:同一个字段对不同商品含义不一样,这到了后面开发和维护是很蛋疼的
纵表:一个商品的属性分布到很多行记录中,业务处理很麻烦,而且纵表的记录数会非常多,性能会有问题

所以不要尝试只用数据库去统一解决这个问题,思路扩散一些其实就简单了

1)公共表:提炼商品公共的信息放到数据库,例如商品id、名称、发布的商家、发布日期、上架状态

2)扩展表:将变化的信息放到另外一个表,可以是数据库表,例如电脑商品一个表、服装一个表;也可以将信息放到MongoDB或者ElasticSearch这类文档数据库。

3)搜索组件:扩展表在全文搜索的时候不好实现,因此需要独立的组件负责搜索,可以用Elastic Search或者Solr来冗余一份数据,用于搜索。

首先来说对于这种场景有两种设计方法,这两种方法都能够满足扩展性要求

1. 把原有的横表转化为纵表存储属性,即

产品表:(product_id, product_name, product_class)

产品属性表:(product_id, property_id , property_name , property_value)

2. 保持原有横表设计思路,但是弹性字段含义单独元数据表存储

产品表:(product_id, product_name, product_class, prop1, prop2, .... propn)

产品属性含义元数据表

(product_class , prop1_name ,prop2_name, ..... propn_name)

对于两种设计方法,个人理解为

a. 对于首页打开就必须要能够快速查询出来的属性,而且这些属性本身各类产品差异不大。而对于差异大的属性基本都是针对特定一个产品查询。可以采用方案1来做。

b. 首页显示产品列表时候就存在要显示出不同产品属性情况,采用方案2来做。当我们处理的是一个product list的时候,由于存在数据表本身的关联场景,用方案1会比麻烦,也影响性能。