一,通俗易懂的三范式
在数据库中建标需要遵循三个规范,这三个规范要求逐渐严格,需依次遵循
第一范式:
要求表中字段不能分割,保证字段的原子性
第二范式
要求表中的字段和表中主属性有关系
第三范式
要求表中的字段和表中的主属性有直接关系,表中必须提供主键
二,数据库的约束
约束名 | 关键字 | 特点 |
---|---|---|
主键约束 | primary key | 唯一,非空,且一张表最多只允许有一个主键 |
唯一约束 | unique | 唯一 |
非空约束 | not null | 不允许为空 |
检查约束 | check | 对数据进行校验 |
默认值 | default | 给字段设置默认值 |
外键约束 | foreign key | 用来进行表关联,数据关联 |
其中检查约束:check,在MySql数据库中不支持,在该数据库中可以使用enum数据类型来设置枚举
代码示例如下(MySql):
create table t_uesr(
id int primary key comment'主键',
username varchar(50) unique not null comment'用户名',
password varchar(50) not null comment'密码',
sex enum('男','女','保密') default '男' comment'性别',
);
三,表的关联关系
- 一对一 (OneToOne)
- 一对多 (OneToMany)
- 多对一 (ManyToOne)
- 多对多 (ManyToMany)
1.一对一
通过定义外键,维护两张表的关联关系,外键必须指向另一表的主键.
用上一个实例的t_user表为例:
建表方法1
create table t_user_info(
id int primary key auto_increment
realname varchar(50) comment '真实姓名',
user_id int unique not null,
constraint t_user_info_fk_user_id foreign key (user_id) references t_user(id)
);
建表方法2(共享主键)
create table t_user_info(
id int primary key,
realname varchar(50),
constraint t_user_info_fk_id foreign key(id) references t_user(id)
);
2,多对一
使用联合主键的方法,多个字段共同作为一个主键。
create table t_student(
id int primary key auto_increment ,
name varchar(100),
...
);
create table t_student(
id int auto_increment ,
name varchar(100),
...,
primary key(id)
);
-- 联合主键 : 表中多个字段共同作为一个主键
create table t_student2(
name varchar(100) ,
tel varchar(11),
primary key(name, tel)
);
3,一对多
create table t_resource(
id int primary key auto_increment,
resource varchar(100) comment '资源存放路径',
resource_desc text comment '资源描述',
--维护关联关系的外键
user_id int,
foreign key (user_id) references t_user(id)
);
4,多对多
多对多的关联关系需要一个中间键,连接方法可以看为两个多对一或者两个一对多。
create table t_role(
id int primary key auto_increment ,
role_name varchar(100) comment '角色名',
role_desc varchar(500) comment '角色描述'
);
-- 中间表 (用一对多方法)
create table t_role_user(
id int primary key auto_increment ,
role_id int ,
user_id int ,
foreign key (role_id) references t_role(id),
foreign key(user_id) references t_user(id)
);
-- 中间表 (用联合主键方法联合主键)
create table t_role_user(
role_id int ,
user_id int ,
foreign key (role_id) references t_role(id),
foreign key(user_id) references t_user(id),
primary key(user_id, role_id)
)
5,最后效果
用ER图表可以直观的看出效果图
关联关系查询
- 左外连接 left [outer] join
- 右外连接 right [outer] join
- 内连接 [inner] join
类似交集并集,假如现在有两组数据
A组:
id | num |
---|---|
1 | 001a |
2 | 002a |
3 | 003a |
4 | 004a |
5 | 005a |
6 | 006a |
B组:
id | num |
---|---|
1 | 001b |
2 | 002b |
3 | 003b |
7 | 007b |
8 | 008b |
9 | 009b |
左外联系
select a.*,b.* from t_A a
left join t_B b
where a.id=b.id
查询的值为a(左表)所有值和b(右表)与a查询条件相同的值,如下表所示:
a.id | a.num | b.id | b.num |
---|---|---|---|
1 | 001a | 1 | 001b |
2 | 001a | 2 | 002b |
3 | 003a | 3 | 003b |
4 | 004a | (null) | (null) |
5 | 005a | (null) | (null) |
6 | 006a | (null) | (null) |
右外联系
select a.*,b.* from t_A a
right join t_B b
where a.id=b.id
查询的值为a(左表)与b查询条件相同的值和b(右表)所有值,如下表所示:
a.id | a.num | b.id | b.num |
---|---|---|---|
1 | 001a | 1 | 001b |
2 | 001a | 2 | 002b |
3 | 003a | 3 | 003b |
(null) | (null) | 7 | 007b |
(null) | (null) | 8 | 008b |
(null) | (null) | 9 | 009b |
内联系
即两表的交集
select a.*,b.* from t_A a
inner join t_B b
where a.id=b.id
查询的值为a(左表)和b(右表)查询条件相同的值,如下表所示:
a.id | a.num | b.id | b.num |
---|---|---|---|
1 | 001a | 1 | 001b |
2 | 001a | 2 | 002b |
3 | 003a | 3 | 003b |