MySQL教程-关系模型
Date 2021-1-22
Author Haihan Gao
什么是关系模型关系模型本质上就是多个存储数据的二维表
表的每一行称为记录
记录是一个逻辑意义上的数据
表的每一列称为字段。同一个表每一行记录拥有若干相同字段
字段定义数据类型:INT,BIGINT,DOUBLE
是否允许为NULL:字段数据不存在,0或空串
不允许为NULL可以简化查询条件,加快查询速度
关系数据库的表之间需要建立一对多,多对一,多对多的关系
关系数据库中,关系通过主键和外键维护
RDBMS(关系数据库管理系统)的特点数据以表格形式出现
每行为各种记录名称
每列为记录名称所对应的数据域
许多行和列形成一张表单
若干表单组成Database
RDBMS术语数据库:关联表的集合
数据表:数据形成的矩阵
列:每一列的数据类型相同
行:一个多元组,其中每一维的数据类型可能相同,可能不同
冗余:存储一个数据的副本,降低性能但是提升安全性
主键一张表中每一行数据称为一个记录,每个记录由多个字段组成
关系表中的约束:一张表中不能有两条重复的记录
不能重复指的是可以通过某个字段唯一区分出不同的记录
这个字段称之为主键
对主键的要求:记录一旦插入表中,主键最好不再被修改
选取主键的基本原则:不使用任何业务相关的字段作为主键
业务无关的字段,称之为id
常见的id类型自增整数
全局唯一的GUID,全局唯一的字符串
使用INT自增作为ID,可能导致溢出的问题
联合主键
两个或多个字段被设置为主键
允许一列重复,只要可以通过多个主键唯一确定记录即可
使得复杂度上升,不建议使用
外键
一对多表-表之间记录建立关系
两个表的关系是一对多的,表示表A的一个记录对应表B的多个记录
找到表B中的某个记录对应的表A中的记录,只需要在表B的记录中加上一列,表示这个记录对应的表A中记录的主键id,有点抽象,可以看这个例子外键
实际上,外键不是通过列名实现的,而是通过外键约束实现的
ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes (id);
做几点说明第二行指定外键约束的名称
第三行指定class_id作为外键
第四行将外键关联到classes表的id列
外键约束还能保证不插入无效的数据,插入的数据需要检查外键是否有效
外键约束的缺点:降低数据库的性能,将class_id视为一个普通的列,应用程序自身检查逻辑的正确性
删除外键约束,通过ALTER TABLE实现
ALTER TABLE students
DROP FOREIGN KEY fk_class_id;
多对多通过两个一对多关系实现的
引入中间表,关联两个一对多关系
一对一一个表中的记录对应另一个表中的唯一记录
student对应contact,在contact表中添加唯一一列student_id
合并两个表?student没有contact
一对一关系存在的另一个原因是存在热数据的问题,一个记录中,某个字段被经常用到,另一些字段用到的概率较小,这样拆分成两个表可以提升查询的效率
比如一个存储用户信息的表user,我们将其拆分成user_info和user_profiles,前者被用到的概率大,这样我们就只用查前面的表就能获得所需信息
索引
对于关系数据库,含有许多条记录,我们为了快速找到某条记录,可以使用索引。
对于一个student表,有如下列id,主键
class_id班级表外键
name
GPA
如果我们要按照GPA列进行查询,可以对GPA列创建索引
ALTER TABLE students
ADD INDEX idx_GPA(GPA);
说明:第二条语句创建了一个名称为idx_GPA,使用GPA列的索引,索引名称是任意的,如果索引有多列,可以在括号中依次写上
ALTER TABLE students
ADD INDEX idx_name_score (name, score);
索引其实是通过一个散列表实现的,只要这个索引的散列性越好,通过这个索引查找记录的效率就越高
对于主键,自动创建主键索引,主键索引保证唯一
索引可以提升查找效率,但是更新删除记录时会导致修改索引,影响更新效率
唯一索引
设计关系数据表的时候,我们往往会遇到一些看上去不会重复的列,比如身份证号,邮箱地址。之前说过这些列不适合作为主键,但是我们可以为这些列添加唯一索引。
添加唯一索引的样例如下
ALTER TABLE students
ADD UNIQUE INDEX uni_name (name);
UNIQUE关键字告诉SQL添加的是唯一索引
也可以对某个列添加唯一约束但是不创建唯一索引
ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);
在关系数据库中查询的时候,如果有索引,数据库系统就会根据索引来提高查找效率。索引用于数据库查找的优化。