Fork me on GitHub

tmall_ssm之数据库

在需求分析结束之后,接下来要做的不是马上开发功能,而是进行表结构的设计。只有把表结构设计正确了,才能支撑软件后续的功能开发,这一步是非常重要的。

数据库的创建

创建数据库tmall_ssm
并将数据库的编码格式设置为utf8,便于存放中文。

1
2
DROP DATABASE IF EXISTS tmall_ssm;
CREATE DATABASE tmall_ssm DEFUALT CHARACTER SET utf8;

1

表关系图

在这张表关系图上,列出了模仿天猫整站一共需要用到的9张表,以及表之间的关系。
2

表介绍

表名 中文含义 介绍
Category 分类表 存放分类信息,如女装,平板电视,沙发等
Property 属性表 存放属性信息,如颜色,重量,品牌,厂商,型号等
Product 产品表 存放产品信息,如LED40EC平板电视机,海尔EC6005热水器
PropertyValue 属性值表 存放属性值信息,如重量是900g,颜色是粉红色
ProductImage 产品图片表 存放产品图片信息,如产品页显示的5个图片
Review 评论表 存放评论信息,如买回来的蜡烛很好用,么么哒
User 用户表 存放用户信息,如斩手狗,千手小粉红
Order 订单表 存放订单信息,包括邮寄地址,电话号码等信息
OrderItem 订单项表 存放订单项信息,包括购买产品种类,数量等

建表

在建表过程中,会设置外键约束,所以表和表之间有依赖关系。因此会先建立被外键指向的表,比如UserCategory,然后再是其他表。

用户表

1
2
3
4
5
6
CREATE TABLE user(
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) DEFAULT NULL,
password varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

分类表

1
2
3
4
5
CREATE TABLE category(
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

属性表

从这个表开始,就有外键约束了。
本表的外cid,指向分类表的id字段。

1
2
3
4
5
6
7
CREATE TABLE property(
id int(11) NOT NULL AUTO_INCREMENT,
cid int(11) DEFAULT NULL,
name varchar(255) DEFAULT NULL,
PRIMARY KEY (id),
CONSTRAINT fk_property_category FOREIGN KEY (cid) REFERENCES category (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

产品表

产品表字段稍多,介绍下。
name: 产品名称
subTitle: 小标题
originalPrice: 原始价格
promotePrice: 优惠价格
stock: 库存
createDate: 创建日期
本表的外键cid,指向分类表的id字段。

1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE product(
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) DEFAULT NULL,
subTitle varchar(255) DEFAULT NULL,
originalPrice float DEFAULT NULL,
promotePrice float DEFAULT NULL,
stock int(11) DEFAULT NULL,
cid int(11) DEFAULT NULL,
createDate datetime DEFAULT NULL,
PRIMARY KEY(id),
CONSTRAINT fk_product_category FOREIGN KEY (cid) REFERENCES category(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

属性值表

本表有两个外键。
外键ptid,指向属性表的id字段。
外键pid,指向产品表的id字段。

1
2
3
4
5
6
7
8
9
CREATE TABLE propertyvalue(
id int(11) NOT NULL AUTO_INCREMENT,
pid int(11) DEFAULT NULL,
ptid int(11) DEFAULT NULL,
value varchar(255) DEFAULT NULL,
PRIMARY KEY(id),
CONSTRAINT fk_propertyvalue_property FOREIGN KEY(ptid) REFERENCES property(id),
CONSTRAINT fk_propertyvalue_product FOREIGN KEY(pid) REFERENCES product(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

产品图片表

type表示类型,产品图片分单个图片和详情图片两种。
本表的外键pid,指向产品表的id字段。

1
2
3
4
5
6
7
CREATE TABLE productimage(
id int(11) NOT NULL AUTO_INCREMENT,
pid int(11) DEFAULT NULL,
type varchar(255) DEFAULT NULL,
PRIMARY KEY(id),
CONSTRATINT fk_productimage_product FOREIGN KEY(pid) REFERENCES product (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

评价表

外键pid,指向产品表的id字段。
外键uid,指向用户表的id字段。

1
2
3
4
5
6
7
8
9
10
CREATE TABLE review(
id int(11) NOT NULL AUTO_INCREMENT,
content varchar(4000) DEFAULT NULL,
uid int(11) DEFAULT NULL,
pid int(11) DEFAULT NULL,
createDate datetime DEFAULT NULL,
PRIMARY KEY(id),
CONSTRAINT fk_review_product FOREIGN KEY(pid) REFERENCES product(id),
CONSTRAINT fk_review_user FOREIGN KEY(uid) REFERENCES user(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

订单表

订单表的字段也比较多,说明一下。
orderCode: 订单号
address: 收货地址
post: 邮编
receiver: 收货人信息
mobile: 手机号码
userMessage: 用户备注信息
createDate: 订单创建日期
payDate: 支付日期
deliveryDate: 发货日期
confirmDate: 确认收货日期
status: 订单状态
外键uid,指向用户表id字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE order_(
id int(11) NOT NULL AUTO_INCREMENT,
orderCode varchar(255) DEFAULT NULL,
address varchar(255) DEFAULT NULL,
post varchar(255) DEFAULT NULL,
receiver varchar(255) DEFAULT NULL,
mobile varchar(255) DEFAULT NULL,
userMessage varchar(255) DEFAULT NULL,
createDate datetime DEFAULT NULL,
payDate datetime DEFAULT NULL,
deliveryDate datetime DEFAULT NULL,
confirmDate datetime DEFAULT NULL,
uid int(11) DEFAULT NULL,
status varchar(255) DEFAULT NULL,
PRIMARY KEY(id),
CONSTRAINT fk_order_user FOREIGN KEY(uid) REFERENCES user(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

订单项表

这个表是外键最多的一个表。
外键pid,指向产品表id字段。
外键oid,指向订单表id字段。
外键uid,指向用户表id字段。
number字段表示购买数量。

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE orderitem(
id int(11) NOT NULL AUTO_INCREMENT,
pid int(11) DEFAULT NULL,
oid int(11) DEFAULT NULL,
uid int(11) DEFAULT NULL,
number int(11) DEFAULT NULL,
PRIMARY KEY(id),
CONSTRAINT fk_orderitem_user FOREIGN KEY(uid) REFERENCES user(id),
CONSTRAINT fk_orderitem_product FOREIGN KEY(pid) REFERENCES product(id),
CONSTRAINT fk_orderitem_order FOREIGN KEY(oid) REFERENCES order_(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

整理表

一般来说,对于一个新项目,建表的时候,会把sql语句都准备好,一次性执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
DROP DATABASE IF EXISTS tmall_ssm;
CREATE DATABASE tmall_ssm DEFAULT CHARACTER SET utf8;
USE tmall_ssm;
CREATE TABLE user (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) DEFAULT NULL,
password varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE category (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE property (
id int(11) NOT NULL AUTO_INCREMENT,
cid int(11) DEFAULT NULL,
name varchar(255) DEFAULT NULL,
PRIMARY KEY (id),
CONSTRAINT fk_property_category FOREIGN KEY (cid) REFERENCES category (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE product (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) DEFAULT NULL,
subTitle varchar(255) DEFAULT NULL,
originalPrice float DEFAULT NULL,
promotePrice float DEFAULT NULL,
stock int(11) DEFAULT NULL,
cid int(11) DEFAULT NULL,
createDate datetime DEFAULT NULL,
PRIMARY KEY (id),
CONSTRAINT fk_product_category FOREIGN KEY (cid) REFERENCES category (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE propertyvalue (
id int(11) NOT NULL AUTO_INCREMENT,
pid int(11) DEFAULT NULL,
ptid int(11) DEFAULT NULL,
value varchar(255) DEFAULT NULL,
PRIMARY KEY (id),
CONSTRAINT fk_propertyvalue_property FOREIGN KEY (ptid) REFERENCES property (id),
CONSTRAINT fk_propertyvalue_product FOREIGN KEY (pid) REFERENCES product (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE productimage (
id int(11) NOT NULL AUTO_INCREMENT,
pid int(11) DEFAULT NULL,
type varchar(255) DEFAULT NULL,
PRIMARY KEY (id),
CONSTRAINT fk_productimage_product FOREIGN KEY (pid) REFERENCES product (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE review (
id int(11) NOT NULL AUTO_INCREMENT,
content varchar(4000) DEFAULT NULL,
uid int(11) DEFAULT NULL,
pid int(11) DEFAULT NULL,
createDate datetime DEFAULT NULL,
PRIMARY KEY (id),
CONSTRAINT fk_review_product FOREIGN KEY (pid) REFERENCES product (id),
CONSTRAINT fk_review_user FOREIGN KEY (uid) REFERENCES user (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE order_ (
id int(11) NOT NULL AUTO_INCREMENT,
orderCode varchar(255) DEFAULT NULL,
address varchar(255) DEFAULT NULL,
post varchar(255) DEFAULT NULL,
receiver varchar(255) DEFAULT NULL,
mobile varchar(255) DEFAULT NULL,
userMessage varchar(255) DEFAULT NULL,
createDate datetime DEFAULT NULL,
payDate datetime DEFAULT NULL,
deliveryDate datetime DEFAULT NULL,
confirmDate datetime DEFAULT NULL,
uid int(11) DEFAULT NULL,
status varchar(255) DEFAULT NULL,
PRIMARY KEY (id),
CONSTRAINT fk_order_user FOREIGN KEY (uid) REFERENCES user (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE orderitem (
id int(11) NOT NULL AUTO_INCREMENT,
pid int(11) DEFAULT NULL,
oid int(11) DEFAULT NULL,
uid int(11) DEFAULT NULL,
number int(11) DEFAULT NULL,
PRIMARY KEY (id),
CONSTRAINT fk_orderitem_user FOREIGN KEY (uid) REFERENCES user (id),
CONSTRAINT fk_orderitem_product FOREIGN KEY (pid) REFERENCES product (id),
CONSTRAINT fk_orderitem_order FOREIGN KEY (oid) REFERENCES order_ (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Your support will encourage me to continue to create!