数据库基础看我就够了⑦,三范式,约束及表的关联关系

本文深入浅出地介绍了数据库设计的三范式,包括第一、第二和第三范式,并详细讲解了数据库的约束以及不同类型的表关联关系,如一对一、一对多、多对一和多对多。同时,提到了外键和主键在关系建立中的作用,以及左外连接、右外连接和内连接等关联查询操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,通俗易懂的三范式

在数据库中建标需要遵循三个规范,这三个规范要求逐渐严格,需依次遵循

第一范式:

要求表中字段不能分割,保证字段的原子性

第二范式

要求表中的字段和表中主属性有关系

第三范式

要求表中的字段和表中的主属性有直接关系,表中必须提供主键

二,数据库的约束

约束名关键字特点
主键约束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组:

idnum
1001a
2002a
3003a
4004a
5005a
6006a

B组:

idnum
1001b
2002b
3003b
7007b
8008b
9009b

左外联系

select a.*,b.* from t_A a
left join t_B b
where a.id=b.id

查询的值为a(左表)所有值和b(右表)与a查询条件相同的值,如下表所示:

a.ida.numb.idb.num
1001a1001b
2001a2002b
3003a3003b
4004a(null)(null)
5005a(null)(null)
6006a(null)(null)

右外联系

select a.*,b.* from t_A a
right join t_B b
where a.id=b.id

查询的值为a(左表)与b查询条件相同的值和b(右表)所有值,如下表所示:

a.ida.numb.idb.num
1001a1001b
2001a2002b
3003a3003b
(null)(null)7007b
(null)(null)8008b
(null)(null)9009b

内联系

即两表的交集

select a.*,b.* from t_A a
inner join t_B b
where a.id=b.id

查询的值为a(左表)和b(右表)查询条件相同的值,如下表所示:

a.ida.numb.idb.num
1001a1001b
2001a2002b
3003a3003b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值