多表之间的关系
1. 一对一。例如:人和身份证
* 在任意一方,添加唯一外键绑定另一方的主键。
2. 一对多。例如:部门和员工.
* 在多的一方设置外键,绑定一的一方的主键(或者唯一值)
3. 多对多。例如:学生和课程
* 一个学生可以选择多门课程,一门课程也可以被多名学生选择
* 多对多实现需要借助第三张表,至少有两个字段,这两个字段作为外键用来对应前两张表的主键,
学生表
学号(id) | 姓名(name) | 年龄(age) |
---|---|---|
1 | 张无忌 | 23 |
2 | 赵敏 | 21 |
3 | 珠儿 | 22 |
课程表
课程编号(id) | 课程名(name) |
---|---|
1 | 英语 |
2 | 数学 |
t_student_class
学号 | 课程编号 |
---|---|
1 | 1 |
2 | 1 |
3 | 2 |
案例
分类—>线路:一对多,在线路最后添加外键指向分类的主键
线路—>游客:多对多,借助第三张表。
- 创建旅游分类表
create table tab_category(cid int primary key auto_increment,cname varchar(100) not null unique);
- 创建线路表
create table route(rid int primary key auto_increment,rname varchar(100) not null unique,price double, rdate date, cid int);
- 创建用户表
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));
- 创建中间表
create table tab_favorite(rid int,uid int,DATE DATETIME,primary key(rid,uid),foreign key(rid) references tab_route(rid),foreign key(uid) references tab_user(uid));
数据库设计的规范
*基础概念:
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. 码:如果在一个表中,一个属性或者属性组,被其他属性完全依赖,则称这个属性为该表得码。
* 1. 设计数据库时遵循的规范要求。
* 2. 三大范式
* 1. 第一范式(1NF):每一列都是不可分割的原子数据项
* 2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
* 主属性:码属性中得所有属性。
* 非主属性:除过主属性得属性。
* 3. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其他非主属性(在2NF基础上消除传递依赖)