IE盒子

搜索
查看: 79|回复: 2

MySQL教程-关系模型

[复制链接]

1

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2023-3-3 10:18:04 | 显示全部楼层 |阅读模式
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);在关系数据库中查询的时候,如果有索引,数据库系统就会根据索引来提高查找效率。索引用于数据库查找的优化。
回复

使用道具 举报

2

主题

8

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 10 小时前 | 显示全部楼层
确实不错,顶先
回复

使用道具 举报

3

主题

7

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 3 小时前 | 显示全部楼层
我也顶起出售广告位
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表