数据库基础
转载自https://github.com/Snailclimb/JavaGuide(添加小部分笔记)感谢作者!
这部分内容由于涉及太多概念性内容,所以参考了维基百科和百度百科相应的介绍。
什么是数据库,数据库管理系统,数据库系统,数据库管理员 #
- 数据库:数据库(DataBase 简称DB)就是信息的集合或者说数据库管理系统管理的数据的集合。
- 数据库管理系统:数据库管理系统(Database Management System 简称DBMS)是一种操纵和管理数据库的大型软件,通常用于建立、使用和维护 数据库。
- 数据库系统(范围最大):数据库系统(Data Base System,简称DBS)通常由**软件、数据和数据管理员(DBA)**组成。
- 数据库管理员:数据库管理员(Database Adminitrator,简称DBA)负责全面管理和控制数据库系统 (是一个人)
数据库系统基本构成如下图所示
什么是元组,码,候选码,主码,外码,主属性,非主属性 #
- 元组:元组(tuple)是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。在二维表里,元组也成为行
- 码:码就是能唯一标识实体的属性,对应表中的列
- 候选码:若关系中的某一属性或属性组的值能唯一的标识一个元组,而其任何、子集都不能再标识,则称该属性组为候选码。例如:在学生实体中,“学号”是能唯一的区分学生实体的,同时又假设“姓名”、“班级”的属性组合足以区分学生实体,那么**{学号}和{姓名,班级}都是候选码**。
- 主码:主码也叫主键,主码是从候选码中选出来的。一个实体集中只能有一个主码,但可以有多个候选码
- 外码:外码也叫外键。如果一个关系中的一个属性是另外一个关系中的主码则这个属性为外码。
- 主属性 : 候选码中出现过的属性称为主属性(这里强调单个)。比如关系 工人(工号,身份证号,姓名,性别,部门). 显然工号和身份证号都能够唯一标示这个关系,所以都是候选码。工号、身份证号这两个属性就是主属性。如果主码是一个属性组,那么属性组中的属性都是主属性。
- 非主属性: 不包含在任何一个候选码中的属性称为非主属性。比如在关系——学生(学号,姓名,年龄,性别,班级)中,主码是“学号”,那么其他的“姓名”、“年龄”、“性别”、“班级”就都可以称为非主属性。
主键和外键有什么区别 #
- 主键(主码) :主键用于唯一标识一个元组,不能有重复,不允许为空。一个表只能有一个主键。
- 外键(外码) :外键用来和其他表建立联系用,外键是另一表的主键,外键是可以有重复的,可以是空值。一个表可以有多个外键
为什么不推荐使用外键与级联 #
对于外键和级联,阿里巴巴开发手册这样说道
【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
说明: 以学生和成绩的关系为例,学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为级联更新。
缺点: 外键与级联更新适用于单机低并发,不适合分布式、高并发集群; 级联更新是强阻塞,存在数据库更新风暴的风 险; 外键影响数据库的插入速度
为什么不要使用外键
增加了复杂性
a. 每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦, 测试数据极为不方便; b. 外键的主从关系是定的,假如那天需求有变化,数据库中的这个字段根本不需要和其他表有关联的话就会增加很多麻烦。
增加了额外操作
...