MySQL学习第三弹。
MySQL-3-数据库的设计
1. 表之间的关系
1. 分类
- 一对一
- 人和身份证
- 一个人只有一个身份证,一个身份证对应一个人
- 一对多
- 部门和员工
- 一个部门有多个员工,而多个员工对应一个部门
- 多对多
- 学生和课程
- 一个学生可以选多门课程,一个课程可以被多个学生选择
2. 实现
一对多:例如,部门和员工
实现方式:在【多】的一方建立外键,指向【一】的一方的主键。
多对多:例如,学生和课程
实现方式:借助第三张中间表。表中至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键
一对一:人和身份证
实现方式:在任意一方添加唯一约束的主键,指向另外一方。
注意:实际中很少这种情况,既然存在一对一,为何不把它们放在同一张表中呢?
3. 旅游线路的分析
旅游线路表、线路分类表、用户表
线路分类下有很多条旅游线路,一条旅游线路可以被多个用户收藏,一个用户可以收藏多条线路。
分析:
代码实现:
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-- 旅游分类表
CREATE TABLE tab_categroy(
cid INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自增长
cname VARCHAR(100) NOT NULL UNIQUE -- cname 非空,唯一
);
-- 旅游线路表
CREATE TABLE tab_route(
rid INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自增长
rname VARCHAR(100) NOT NULL UNIQUE, -- rname 非空,唯一
price DOUBLE,
rdate DATE,
cid INT, -- 外键
-- 将cid与tab_categroy中的cid关联
FOREIGN KEY(cid) REFERENCES tab_categroy(cid)
);
-- 用户表
CREATE TABLE tab_user(
uid INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自增长
username VARCHAR(100) UNIQUE NOT NULL,
PASSWORD VARCHAR(30) NOT NULL,
NAME VARCHAR(100),
birthday DATE,
sex CHAR(1) DEFAULT '男', -- 性别,默认男
telephone VARCHAR(11),
email VARCHAR(100)
);
-- 收藏(连接用户与线路)
CREATE TABLE tab_favorite(
rid INT,
DATE DATETIME, -- 关联时间
uid INT,
PRIMARY KEY(rid,uid),
FOREIGN KEY(rid) REFERENCES tab_route(rid), -- rid关联tab_route中的rid
FOREIGN KEY(uid) REFERENCES tab_user(uid) -- uid关联tab_user中的uid
);SQLyog架构设计器显示