数据库、外键

一、数据库介绍以及发展历史

数据库是用来存放数据的,但是数据不是直接存放在数据库中的。
数据库中存放的是表,而在表中存放的才是数据。
例如:下面的航班数据库,在该数据库中建立了三张表:旅客信息表、航班信息表、机票信息表。这三张表中存储的才是数据。
alt

数据库的发展史

1.萌芽阶段(文件)
所有的存储数据的文件都属于数据库.安全性低.
2.层次模型
  ①.优点:查询分类的数据效率比较高
  ②.缺点:
      导航结构,如果查找不同类型的数据,那么效率非常低
      数据的不完整(如下图)
alt3.网状模型
alt
网状模型解决了数据的不完整性,但是没有解决导航问题
4.关系模型
现在的主流数据库都是关系型数据库

特点:每个表都是独立的,没有导航结构,表与表之间通过公共的字段建立关系.

注意:公共字段的名字可以不一样,但是数据类型必须一样.数据类型一样的但它不一定是公共字段.两个字段必须数据类型必须一样,字段的含义必须一样

记录.行.列.字段.属性.字段的属性.数据

1.一行我们通常称为一条记录
2.一列称为一个字段,也叫一个属性

  就表结构层面而言:表分为行和列
  就数据层面而言:表分为记录和字段
3.数据冗余:相同的数据储存在不同的地方
alt
①.冗余只能减少,不能完全杜绝
②.冗余减少了,表的体积也就减小了,更新的速度加快了,保存了数据的完整性.
③.但是减少了冗余,那么肯定增加了表,多表查询的效率又降低了,在项目中有的时候宁可让数据冗余也要保证查询的效率.(但效率和规范起冲突的,效率要大于规范,保证实用性)

4.数据的完整性
正确性+准确性 = 数据的完整性

分析: 学生的年龄字段(age int),储存到1000,问正确性如何?准确性又如何?
  正确但是不准确
  正确性:描述数据类型是否准确
  准确性:描述数据的范围是否合理(准确)

二、数据的完整性:

1. 实体的完整性:
一条记录就是一个实体;如果记录无法区分就称之为失去了数据的完整性。
2. 域的完整性:
如果两个字段无法区分,称之为失去了域的完整性。
3. 引用的完整性
两个表的对应记录不完整(不可避免的)
4. 自定义完整性:
自己制定的规则在实现后出现了偏差。

保证数据的完整性:

保证实体的完整性 1.自动增长列(auto_increment)
2.主键的约束(primary key)
3.唯一键(unique)
保证域的完整性 1.数据类型的约束
2.默认值约束
3.非空的约束
保证引用的完整性 建立外键->只用主表有的,从表不一定会有(从表中还不能删除)
自定义完整性 1.存储过程(比较像python的自定义函数)
2.触发器

三、外键

外键:从表的公共字段
外键约束用来保证引用的完整性,主外键的名字可以不一样,但是数据类型必须一样.

特点:
1.主表中不存在的记录,从表中不能插入
2.从表中存在记录,主表中不能先删除
3.必须先删除从表,再删除主表

Ⅰ.创建外键

--学生表(主表)
create table stuinfo(
id int auto_increment comment'主键' primary key,
stu_name varchar(255)
)engine=innodb;
#添加一条数据

insert into stuinfo set `stu_name`='张立';

--成绩表(从表)
create table stumarks(
stuno int  comment'主键',
ch float,
math float,
foreign key (stuno) references stuinfo(id) on delete set null on update cascade
)engine=innodb;
#foreign key(stuno) references stuinfo(id)

#修改表的时候添加一个外键
#修改成绩表增加外键学号关联学生信息表的id字段
alter table stumarks add foreign key (stuno) references stuinfo(id);
#当主表删除 从表设置为空(指的是外键字)(级联设置)
#on delete set null
#当主表删除  从表中整条数据跟着删除(级联删除)
#on delete set cascade
#当修改主表时 从表的关联字段也跟着修改(级联修改)
#on update cascade

#alter table stumarks add foreign key (stuno) references stuinfo(id) on delete set null on update cascade;

--查看给表分配的外键
show create table stumarks\G
#CONSTRAINT `stumarks_ibfk_1`:是mysql分配给外键的名字

#指定一个名字给外键(添加一个索引)
alter table stumarks add CONSTRAINT `stuno` foreign key (stuno) references stuinfo(id) on delete cascade on update cascade;

#删除外键
alter table stumarks drop foreign key stumarks_ibfk_1;

注意:
如果要在某个字段上添加外键,这个字段必须有索引才可以,如果这个字段没有索引就直接添加外键,那么mysql会自动创建索引.

Ⅱ.外键的操作
1.严格约束(外键约束),保证引用的完整性
2.置空操作(set null):主表记录删除或者更新,从表的外键字段设置为null
3.联级操作(cascade): 主表的记录删除或者更新,从表外键字段一起发生变化
4.一般都是删除的时候外键字段置空,修改的时候更新关联

alter table stumarks add  foreign key (stuno) references stuinfo(id) on delete set cascade on update cascade;
注意:从表的关联(外键)字段一定不能是主键

外键在数据量特别小的时候会用上,一般是开发者自己清楚数据库表的设计,你知道那个是主表,那个是从表,然后手动修改,使用’事务’,为什么?
1.mysql表中设置外键会影响效率.
2.一般来说,每个从表都是单独数据,需要用到单独操作.

四、实体之间的关系

实体就是我们所看到的每一条记录。
实体之间关系:

  1. 一对一的关系:主键关系,一个实体中有一个主键,例如,一个学生的学号对应其后边的名字信息
  2. 一对多(多对一)的关系:一个学生对应多门课程,多门课程对应一个学生
  3. 多对多

五、数据库的设计

  1. 标识的实体
  2. 写出实体的属性
  3. 标识实体之间的关系
  4. 画E-R图(语法)
  5. 看图建立数据库和表
  6. 规范化:
    ① 第一范式:确保每一列的数据原子化(不可分割)
    ② 第二范式:非主键字段必须依赖主键字段(一个表只描述一件事情)
      第二范式是约束普通字段和主键字段的
    ③ 第三范式:在非逐渐字段中,一个字段确定了,其他字段也确定称为传递依赖
      第三范式是约束非主键之间的

六、规范化和性能之间的关系

规范化容易导致数据冗余,影响效率。
所以,在性能和规范,我们优先选择性能。

猜你喜欢

转载自blog.csdn.net/weixin_42205723/article/details/88530452