本篇文章是字节跳动青训营tiktok_e-commence项目,商品服务以及购物车服务,的数据库表设计。
一般的项目设计步骤:
1. 需求分析
- 收集需求:与客户或业务方沟通,了解项目的目标、功能需求、性能要求、安全需求等。
- 需求文档:编写详细的需求规格说明书(SRS),明确项目的目标、范围、功能、界面设计等。
2. 系统设计
2.1 架构设计
- 选择架构:确定项目的总体架构,如MVC(Model-View-Controller)、MVVM(Model-View-ViewModel)等。
- 技术选型:选择合适的技术栈,包括前端框架、后端框架(如Spring Boot、Spring MVC)、数据库(如MySQL、PostgreSQL、MongoDB)等
2.2 数据库设计
- ER图:绘制实体关系图(ER图),定义数据库表结构、字段、主键、外键等。
- 数据字典:编写数据字典,详细描述每个表的字段及其含义。
设计的流程我就不完全放在了,感兴趣的自己去搜搜,本篇文章是根据springboot+springcloud以微服务的设计模式,由于数据库设计是依据系统架构设计,go语言的技术栈设计会与本项目略有不同,但万变不离其宗,仍有借鉴价值。
心得:
-
设计的时候要从全局去考虑,需求分析-->系统设计-->数据库设计。把所有需求,依据技术栈,完完全全的设计出来。切忌要做到哪,在设计到哪。
为什么:因为想到哪设计到哪,一旦有新的想法,就要回头去更改。 最致命的是发现有数据库有逻辑问题,推倒重来,白干。 本篇由于给出了具体需求,建议设计时长大概占比1/3。 我是全部做完,回头发布这篇文章的,由于篇幅较长,不得已分开写的。
设计正文
products (产品表)
-
id: 产品的唯一标识符,无符号bigint类型。
-
name: 产品名称,varchar(255)类型。
-
description: 产品描述,text类型。
-
picture: 产品图片链接,varchar(255)类型。
-
price: 产品价格,bigint类型。
-
created_at: 创建时间戳,datetime(0)类型。
-
updated_at: 更新时间戳,datetime(0)类型。
-
extra_field1: 扩展字段1,varchar(255)类型。
-
extra_field2: 扩展字段2,text类型。
-
extra_field3: 扩展字段3,int(0)类型。
-
extra_field4: 扩展字段4,tinyint(1)类型。
-
extra_field5: 扩展字段5,timestamp(0)类型。
为什么:1.看起来有点乱,但主要逻辑是没问题的。一般来说留出三个冗余字段就好(企业中重新申请字段是一个麻烦事儿) 2.这些字段,基本上是入库就是一成不变的,单独设计为一张产品表,把需要经常变更的表设计出去。代码要解耦,数据库也是一样的。
product_categories (产品分类表)
-
id: 分类的唯一标识符,bigint类型。
-
category_name: 分类名称,varchar(255)类型。
-
product_id: 关联的产品ID,bigint类型。
-
extra_field2: 扩展字段2,text类型。
-
extra_field3: 扩展字段3,int(0)类型。
-
extra_field4: 扩展字段4,tinyint(0)类型。
-
extra_field5: 扩展字段5,timestamp(0)类型。
-
created_at: 创建时间戳,datetime(0)类型。
-
updated_at: 更新时间戳,datetime(0)类型。
-
deleted_at: 删除时间戳,timestamp(0)类型。
为什么: 1.这是一张以解耦为设计的表,用产品表字段id相互关联,把产品名称分出去,这是一张搜索表。 2.通常在spring里这张表是不存在mysql数据库里,一般在搜索数据库里,mysql是关系数据库,检索它不擅长,而且大部分业务都存在mysql里,再去干搜索的活,数据库压力太大。 3.如果不分出去设计,到时候把产品信息也存进去,不仅内存占用大,维护的时候,工作量直接起飞。
cart_items (购物车项表)
-
id: 购物车项的唯一标识符,无符号bigint类型。
-
user_id: 用户ID,varchar(64)类型。
-
product_id: 产品ID,bigint类型。
-
quantity: 数量,bigint类型。
-
created_at: 创建时间戳,datetime(0)类型。
-
one: 扩展字段1,varchar(25)类型。
-
two: 扩展字段2,varchar(25)类型。
-
three: 扩展字段3,varchar(25)类型。
-
four: 扩展字段4,varchar(25)类型。
为什么: 1.这是一张购物车表,你们设计的时候可以把_items去掉这个是多余的。 2.这张表是用户在登录后,添加购物车即可,所以得关联usr表id,产品表id 3.需要注意的是这张表的quantity字段,根据前端传多少就是多少,下单的时候在减少库存。
products_quantity (产品数量表)
-
id: 记录的唯一标识符,int(0)类型。
-
products_id: 产品ID,bigint(0)类型。
-
quantity: 数量,bigint(0)类型。
-
one: 扩展字段1,varchar(255)类型。
-
two: 扩展字段2,varchar(255)类型。
-
three: 扩展字段3,varchar(255)类型。
为什么1.产品数量表,这张表就是典型的经常需要操作的表,这张表quantity是库存字段,下单的时候需要的产品数量-库存数量。所以这里涉及一个问题。如果库存量剩余一,两个人同时下单,如何解决?---加锁