我们团队项目是微图书销售小程序,根据需求一共设计了12个表和两个视图(cart_view,order_detail_view)。
小组:3班6组
我们小团队在设计数据库所花花时间一共是两周,从设计到完成导入数据进行测试。
在设计这个数据库过程有挺多挫折的,首先就是需求的变化,在每一次见指导老师都会有需求的变化,导致数据库之前设计出的版本继续修改,但是这样我们团队在设计数据库过程中学会了考虑需求变化而对数据库进行可拓展的设计。
接下来讲一下我们的数据库:
一共 12个表:
分别是用户信息表,收货地址表,用户收藏表,购物车表,店铺信息表,图书基本信息表,图书类型表,图书详情与图书类型关系表,图书评价表,订单表,订单明细表,消息队列表
- 用户信息表:
实体描述:
实体编号 | 实体名称 | 实体命名 |
01 | 用户表 | user_table |
实体说明 | 用户的基本信息 |
用户实体属性列表
属性名 | 类型 | 是否 主键 | 是否外键 | 可否 为空 | 默认值 | 说明 | 备注 |
user_id | varchar(30) | 是 | 否 | 否 | 无 | 用户id | 为用户在微信小程序中的openid,唯一标识用户 |
store_id | int | 否 | 是 | 是 | 无 | 店铺id | 当用户为卖家时该值指向用户的店铺 |
birthday | date | 否 | 否 | 是 | 无 | 生日 | 用户的出生日期 |
sex | char(1) | 否 | 否 | 是 | 无 | 性别 | 用户的性别 |
user_type | int | 否 | 否 | 否 | 0 | 用户类型 | 设定了四种用户类型,对应0-3 |
phone | varchar(11) | 否 | 否 | 是 | 无 | 电话号码 | 用户的电话号码 |
vip_level | int | 否 | 否 | 否 | 0 | vip等级 | 用户的vip等级 |
consumption | double | 否 | 否 | 否 | 0 | 消费总计 | 用户从注册到目前消费的总额 |
单一个 用户信息表可以实现用户登录和用户基本信息修改功能,用户登录时候获取他的user_id,这个user_id将作为小程序端的全局变量,在以后的交互过程中经常调用。比如修改用户基本信息。这时候需要用到该表的birthat,sex,phone字段,用户的操作会影响这些字段的更新。其次,user_type字段是我们考虑到,二期迭代开发每个用户可以有其他用户模式,比如图书管理模式,就是商家,或者是高级管理员模式,亦或是同时是商家也是高级管理员模式(这3种用户本身也有普通用户模式),商家和高级管理员模式可以行使不同的功能,比如商家可以拥有自己的店铺,就是表中的store_id,而高级管理员是对软件的维护。而表中的consumption是记录用户消费金额,这个会影响用户的Vip_level
2.收货地址表:
实体描述:
实体编号 | 实体名称 | 实体命名 |
01 | address_table | address_table |
实体说明 | 用户收货地址表 |
收货地址实体属性列表
属性名 | 类型 | 是否 主键 | 是否外键 | 可否 为空 | 默认值 | 说明 | 备注 |
address_id | int | 是 | 否 | 是 | 无 | 地址编号 | 唯一标识地址信息 |
user_id | varchar(30) | 否 | 是 | 是 | 无 | 用户编号 | 用户编号 |
phone | varchar(11) | 否 | 否 | 是 | 无 | 手机号码 | 收货人电话 |
recevier | varchar(30) | 否 | 否 | 是 | 无 | 收货人姓名 | 收货人的姓名 |
receiver_address | Varchar(100) | 否 | 否 | 是 | 无 | 收货人地址 | 收货人地址 |
收货地址表与用户信息表关联,外键user_id确定是哪个用户,然后找到该用户的具体收货地址,这个表可以实现用户对自己收货地址的增删改查的操作
3.用户收藏表:
实体描述:
实体编号 | 实体名称 | 实体命名 |
02 | collect_table | collect_table |
实体说明 | 用户收藏书籍或者店铺表 |
用户收藏实体属性列表
属性名 | 类型 | 是否 主键 | 是否外键 | 可否 为空 | 默认值 | 说明 | 备注 |
collect_id | int | 是 | 否 | 是 | 无 | 收藏编号 | 收藏信息唯一标识符 |
user_id | varchar(30) | 否 | 是 | 是 | 无 | 用户编号 | 用户唯一标识符 |
object | int | 否 | 否 | 是 | 无 | 收藏物品 | 收藏物品 |
collect_type | int | 否 | 否 | 是 | 无 | 收藏类型 | 收藏的类型 |
主键是collect_id,外键是user_id,与用户信息表关联,可以实现用户对自己收藏的增删改查操作,同时collect_type是区分用户收藏的是书籍还是店铺,object就是书籍或店铺的id
4.购物车表:
实体描述:
实体编号 | 实体名称 | 实体命名 |
02 | 购物车表 | shopping_cart |
实体说明 | 购物车信息 |
购物车实体属性列表
属性名 | 类型 | 是否 主键 | 是否外键 | 可否 为空 | 默认值 | 说明 | 备注 |
book_id | int | 是 | 是 | 否 | 无 | 图书id | 唯一标识图书信息的符号 |
user_id | varchar(30) | 是 | 是 | 否 | 无 | 用户id | 唯一标识用户信息的符号 |
number | int | 否 | 否 | 否 | 无 | 图书数量 | 记录购物车中每一种图书的数量 |
购物车表相对简单,通过user_id和book_id找到用户购物车中的商品数量和信息
5.店铺信息表:
实体描述:
实体编号 | 实体名称 | 实体命名 |
02 | 店铺表 | store_table |
实体说明 | 店铺的基本信息 |
店铺实体属性列表
属性名 | 类型 | 是否 主键 | 是否外键 | 可否 为空 | 默认值 | 说明 | 备注 |
store_id | int | 是 | 否 | 否 | 无 | 店铺id | 用于唯一标识店铺的id,设定了自增 |
store_name | varchar(30) | 否 | 否 | 否 | 无 | 店铺名称 | 注册店铺时设置的店铺名称 |
description | varchar(200) | 否 | 否 | 是 | 无 | 店铺描述 | 注册店铺时设置的店铺描述 |
create_time | date | 否 | 否 | 否 | 无 | 店铺注册时间 | 注册店铺时的时间 |
star_level | int | 否 | 否 | 否 | 1 | 店铺星级 | 表示店铺质量的店铺星级 |
店铺信息表store_id是主键,和用户信息表里面的store_id联系起来,可以知道店铺的拥有者,其他字段即为店铺基本信息
6、图书基本信息表:
实体描述:
实体编号 | 实体名称 | 实体命名 |
01 | 图书基本信息表 | Book_table |
实体说明 | 图书基本信息 |
图书实体属性列表
属性名 | 类型 | 是否 主键 | 是否外键 | 可否 为空 | 默认值 | 说明 | 备注 |
book_id | int | 是 | 否 | 否 | 无 | 自增 | 唯一标识图书的符号 |
store_id | int | 否 | 是 | 否 | 无 | 店铺id | 店铺id |
book_name | varchar(40) | 否 | 否 | 否 | 无 | 图书名 | 图书名 |
book_description | varchar(2000) | 否 | 否 | 是 | 无 | 图书文字描述 | 图书文字描述 |
picture_description | varchar(100) | 否 | 否 | 是 | 无 | 图片描述 | 图片描述 |
inventory | int | 否 | 否 | 否 | 无 | 库存 | 库存 |
book_author | varchar(50) | 否 | 否 | 否 | 无 | 图书作者 | 图书作者 |
book_press | varchar(40) | 否 | 否 | 否 | 无 | 图书出版社 | 图书出版社 |
price | int | 否 | 否 | 否 | 无 | 价格 | 价格 |
cover | varcher(100) | 否 | 否 | 否 | 无 | 封面 | 封面 |
Book_id唯一标识一本书,考虑到不同的店铺可以卖同一本书,然后对该书的其他信息描述不同(比如店家介绍,优惠价格),所以同一本书也可以有不同的book_id,inventory这个库存信息是我们用来考虑给图书库存加阈值时用到的字段,阈值是多少由后台确定
7、图书类型表
实体描述:
实体编号 | 实体名称 | 实体命名 |
02 | 图书类型表 | Book_type |
实体说明 | 图书类型信息 |
图书类型实体属性列表
属性名 | 类型 | 是否 主键 | 是否外键 | 可否 为空 | 默认值 | 说明 | 备注 |
type_id | int | 是 | 否 | 否 | 无 | 自动编号 | 图书类型唯一标识符 |
type | varchar(20) | 否 | 否 | 否 | 无 | 图书类型 |
|
单独设计一个图书类型表,考虑到第2第3范式,如果出现某一类书只有一种书如果下架该书籍,那个类别就会消失的问题,所以开设这样一个表
8、图书详情与图书类型关系表
实体描述:
实体编号 | 实体名称 | 实体命名 |
03 | btrelation_table | btrelation_table |
实体说明 | 图书详情和图书类型的关系表 |
图书详情与图书类型关系实体属性列表
属性名 | 类型 | 是否 主键 | 是否外键 | 可否 为空 | 默认值 | 说明 | 备注 |
book_id | int | 是 | 是 | 是 | 无 | 图书编号 | 图书唯一标识符 |
type_id | int | 是 | 是 | 是 | 无 | 类型编号 | 类型唯一标识符 |
将图书详情表和图书类型表关联起来的一个表
9、图书评价表:
实体描述:
实体编号 | 实体名称 | 实体命名 |
01 | 图书评价表 | evaluation_table |
实体说明 | 图书的评价信息 |
图书评价实体属性列表
属性名 | 类型 | 是否 主键 | 是否外键 | 可否 为空 | 默认值 | 说明 | 备注 |
user_id | varchar(30) | 是 | 是 | 否 | 无 | 用户id | 唯一标识用户信息的符号 |
book_id | int | 是 | 是 | 否 | 无 | 图书id | 唯一标识图书信息的符号 |
content | varchar(200) | 否 | 否 | 否 | 无 | 评价内容 | 评价内容详细信息 |
图书评价表,主键是user_id和book_id,这个评价不管是哪个用户登录查看某本书评价,都会看到某个用户对该书的评价,例如淘宝
10、订单表
实体描述:
实体编号 | 实体名称 | 实体命名 |
02 | 订单表 | order_table |
实体说明 | 订单信息 |
订单实体属性列表
属性名 | 类型 | 是否 主键 | 是否外键 | 可否 为空 | 默认值 | 说明 | 备注 |
order_id | int | 是 | 否 | 否 | 无 | 订单号 | 订单信息唯一标识符 |
user_id | varchar(30) | 否 | 是 | 否 | 无 | 用户id | 用户信息唯一标识符 |
address | varcher(100) | 否 | 否 | 否 | 无 | 收货地址 | 收货地址信息 |
phone | varcher(11) | 否 | 否 | 否 | 无 | 收货人手机号码 | 收货人手机号码信息 |
receiver | varcher(30) | 否 | 否 | 否 | 无 | 收货人姓名 | 收货人姓名信息 |
order_time | date | 否 |
| 否 | 无 | 下单时间 | 下单时间信息 |
order_state | varchar(10) | 否 | 否 | 否 | 无 | 订单状态 | 订单状态 |
订单详情表根据外键user_id和用户信息表关联,用户可以查看自己的具体订单信息,也可以对订单进行增删改查,可以修改order_state,即订单状态(待付款之类的),也可以修改收货地址,手机等信息(但是具体能不能修改要看订单状态,这就是具体逻辑了,已发货肯定不能再改了)
11、订单明细表
实体描述:
实体编号 | 实体名称 | 实体命名 |
03 | 订单明细表 | orderdetail_table |
实体说明 | 订单详情信息 |
订单明细实体属性列表
属性名 | 类型 | 是否 主键 | 是否外键 | 可否 为空 | 默认值 | 说明 | 备注 |
book_id | int | 是 | 是 | 否 | 无 | 图书标号 | 图书信息唯一标识符 |
order_id | int | 是 | 是 | 否 | 无 | 订单编号 | 订单信息唯一标识符 |
book_count | int | 否 | 否 | 否 | 无 | 订单中当前图书数量 |
|
book_totalprice | double | 否 | 否 | 否 | 无 | 订单中本图书总价格 |
|
订单明细表就是看订单里面具体商品的信息,通过book_id和order_id看到具体的订单里面的商品信息(同一个订单里面可以有不同的书,所以这两个字段一起作为主键),然后ordder_id作为外键和订单表关联,订单表又与用户信息表关联,所以用户就可以完成查看订单里面具体商品信息的操作
12、消息队列表
实体描述:
实体编号 | 实体名称 | 实体命名 |
01 | 消息队列表 | message_queue |
实体说明 | 储存所有的消息 |
消息队列实体属性列表
属性名 | 类型 | 是否 主键 | 是否外键 | 可否 为空 | 默认值 | 说明 | 备注 |
message_id | int | 是 | 否 | 否 | 无 | 自动递增(从1开始) | 唯一标识消息的符号 |
sender_id | varchar(30) | 否 | 是 | 否 | 无 | 发送者id |
|
receiver_id | varchar(30) | 否 | 是 | 否 | 无 | 接收者id |
|
send_time | datetime(30) | 否 | 否 | 否 | 无 | 发送消息的时间 |
|
message_detail | varchar(200) | 否 | 否 | 否 | 无 | 消息内容 |
|
这个表示针对2期迭代的留言功能,具体是买家给卖家留言还是高级管理员与其他用户互动等等情况要根据send_id 和receiver_id而定。