1、多表之间的关系
1.1、分类
1.1.1、一对一的关系(了解)
- 如 人和身份证的关系
1.1.2、一对多 (多对一) 的关系
- 比如 部门和职员的关系
一个部门对应多个职员
一个职员只能对应一个部门
1.1.3、多对多 的关系
- 学生和课程关系
一个学生可以选很多课,一门课也可以被多个学生选择
1.2、实现
1.2.1、一对多 (多对一) 的实现
- 部门和员工的关系
- 在多的一方建立外键,去指向 一 的表中的主键
1.2.2、多对多 的实现
- 学生和课程之间的关系
- 表多对多的实现主要是通过添加一张 第三张 表格来实现的,第三张中间表里面至少要包含2个字段,分别对应之前两张表的主键。
1.2.3、一对一 的实现
- (1)可以通过在两张表中添加唯一外键去指向另一方的主键
- (2)可以把这两张表的主键都设置成一样的
1.3、案例
- (1)、数据库表分析
- (2)、创建数据库
创建数据库 名为 travel
create database if not exists travel;
创建旅游条目分类表
CREATE TABLE travel_items(
cid int PRIMARY KEY auto_increment,
name VARCHAR(32) not null UNIQUE
);
创建线路表
CREATE TABLE tab_route(
rid int PRIMARY KEY auto_increment,
rname VARCHAR(100) UNIQUE not NULL,
price DECIMAL(10,2),
rdate date,
cid int,
FOREIGN KEY (cid) REFERENCES tab_category(cid)
);
创建用户表
CREATE TABLE tab_user(
uid int PRIMARY KEY auto_increment,
username VARCHAR(100) UNIQUE not null,
password VARCHAR(30) not NULL,
name VARCHAR(30),
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),
FOREIGN KEY(uid) REFERENCES tab_user(uid)
);
2、数据库的范式
2.1、分类
- 第一范式(1NF)
- 第二范式(2NF):(在1NF基础上)
- 第三范式(3NF):(在2NF基础上)
2.2、第一范式
- 每一列都是不可分割的原子数据项
2.3 第二范式
-
在1NF的基础上,非码属性必须完全依赖于候选码(在1NF的基础上消除非主属性对主码的部分函数依赖)
-
几个概念:
(1)、函数依赖:A–>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值,则称B依赖于A
例如: 学号 --> 姓名。 (学号,课程名称)–>分数(2)、完全函数依赖:A–>B,如果A是一个属性组,则B属性值的确定需要依赖于A属性组中所有的属性值。
例如:(学号、课程名称) --> 分数(3)、部分函数依赖:A --> B,如果A是一个属性组,则B属性中的确定需要依赖于A属性组中的某一些即可
例如:(学号、课程名称)–> 姓名(4)、传递函数依赖:A–>B ,B–>C,如果通过A属性(属性组的值),可以确定唯一B属性的值,再通过B属性(属性组的值),可以确定唯一C属性的值,则称C传递函数依赖于A
例如:学号 -->系名 系名 -->系主任(5)、码:如果在一张表中,一个属性或者属性组,被其它所有属性所完全依赖,则称这个属性(属性组)为该表的码
例如:在该表中的码:(学号,课程名称)
主属性:码属性组中的所有属性
非主属性:除了码属性组中的属性
2.4 第三范式
3、数据库的备份和还原
- 命令行的形式备份还原
- 图形图像的形式备份还原