数据库基础理论

数据库

数据库是按照数据结构来组织,储存,管理数据的仓库。数据库在物理层上有效的利用系统对磁盘的块读取特性,在读取相同磁盘块的同时,尽可能多的加载索引数据,来提高索引命中效率,从而达到减少磁盘IO的读取次数

传统的记录数据的方式使用普通文件的记录,但是这种储存的方式在进行数据 查询时极其不方便,不能快速定位到我们需要的数据,而是需要从头检索的方式进行查询,这在大量的数据下每次查找都会极大的浪费查询时间。为了解决这些问题,就需要一些特殊数据储存形式和方便的数据结构来优化。这就诞生了数据库系统。数据库发展到现在,较为主流的数据库形式有关系型数据库和非关系型数据库

关系型数据库

关系型数据库使用行、列组成二维表来组织数据和关系,表中的行(记录)描述数据实体,列描述实体之间的关系。这样可以方便我们的查询操作。并且在物理储存的底层,经过大量的专业人员的对数据逻辑的构建和优化,使得我们不需要考虑物理层数据的储存细节,只需要专注于数据逻辑的建立构建。并为了方便的操作这种数据库,方便的进行例如数据的增删改查的各种操作,还产生了结构化查询语言SQL,并被ISO组织标准化。

 

关系型数据库使用一张张二维表来记录信息,二维表列指定数据的属性字段有哪些,每一行代表一个数据。字段的取值范围称为一个域Domain。通常我们将字段的个数叫做维数,维数越大,字段越多。将表的数据行数叫做基数,基数越大,说明这个表的信息条数越大。字段(列)的顺序并不重要,但是行的顺序涉及到数据的储存,一个合理顺序可以提高些许的效率。例如我们将数据按照ID从小到大的规则储存,而不是随意无序储存

数据库两个重要的作用是存储数据查询数据,构建这种储存数据的方式也是为了方便查询,这也是数据库诞生的初衷。所以解决数据的快速定位查询相当的重要。所以数据库使用了一些方便查询的方式去解决这样的问题。也就是下文所说的键,索引,约束等

主键

表通常会使用一列作为主键,也可以使用多列作为联合主键。主键的列能够唯一标识数据且不能够包含null值,通常主键设置为整形和整形,通常为表设置id字段作为主键,并设置AUTO_INCREMENT自增属性。mysql的InnoDB引擎下表要求必须使用主键。以主键建立的主键索引直接和数据储存和查询相关联,是一个非常重要的属性。

候选键

 

候选键:将一条或多条可以唯一标识数据的属性候选键,将每一条数据加以区分。例如使用表的id标识一条记录,使用身份证号码唯一标识一位公民。这种标识也可以是多个数据的组合。使用它能够标识一条唯一的数据。

外键

严格来说,当一个关系中的属性或者属性集合与另一个关系(也可以是自身)的候选键匹配时,就称这个属性或属性集合是外键。

例如,在一个员工表中,需要使用一个字段来记录这个员工所处的部门(部门是另一个表),这个字段就只需要记录一下部门表对应的id值即可。这个字段就称为外键,因为这个字段引用了外部表(也可以是自己表)的键

索引

主键索引

主键会自动建立主键索引,主键索引使用B+数的数据结构直接与数据位置关联,可以理解为一本大字典目录,有了这个目录,可以快速找到数据的页码范围,而不是一页页的去寻找。主键索引是直接与数据关联,找到对应主键节点,便可得到数据的位置周到数据

其他索引

mysq还包括了以下的索引,成为索引的字段都会按照B+树的方式对该列的数据进行排序,而这些非主键索引并不会关联真正的数据,而是会关联主键索引,再通过主键索引实现获取数据。

  • 唯一索引:索引列的数据中,除去了非空值,每一条数据值都不相同,是唯一的。
  • 普通索引:普通索引没有数据要求,按照某一规律建立一个索引树即可,尽量将可以区分的数据区分。查询时一般可以快速定位到一条或部分的数据,再做进一步。
  • 联合索引:使用多个字段组合创建索引,查询匹配时候,先将匹配左边的字段信息。
  • 全文索引:MyISAM引擎使用,全文搜索匹配,对于Char、Varchar、Text类型数据使用,可以快速检索表中所有字段中包含某个字符的数据。

构建索引的目的是加快查询,可以快速定位数据物理地址,在尽量少的IO下获取数据,但是这个相对的,索引可以加快查询的速度,但是对数据的修改,添加,删除都会减低速度,因为在修改数据的同时还需要修改这些数据目录,同时,建立索引需要时间和空间。所以在建立索引时我们需要考虑这些因素。

数据库数据存储与查询

为了方便快速查询,一般会采用key-value的数据结构,利用hash查询的O(1)时间复杂度,这对于查询单个数据是一种十分有效的方法。但是数据库不只是需要单个数据的查询,通常需要进行范围查询,所以数据底层使用B+树的数据结构来管理数据。

B+树是一种平衡二叉树(最长最短路径差值最大为1),B+树的所有中间节点都不会储存数据,数据只会储存在叶子节点中,所有的叶子节点连接成一个链表,数据在这个链表按照主键的顺序依次存储。

约束

值约束

保证值的数据类型,数据长度满足定义是要求,某些数据不能为NUll值,必须填入数据,这些都是对数据值得约束

域约束(Domain Constraint)

约束某些字段的取值范围。

实体完整性(主键约束)(Entity Intergrity)

主键约束:PRIMARY KEY约束 定义了主键,

引用完整性(外键约束)

当一个表的字段引用了另一个表的键(多数情况为主键)将这两个表关联,这两表将发生引用关系,引用了其他表的表为从表,被引用的表为主表。由于两张表发生了引用,则需要进行引用完整性的考虑,需要设置两个表的外键约束。

设定值 说明
CASCADE 级联:主表删除或更新一条数据后,从表中所有引用了主表该数据的记录将会被删除
SET NULL 主表删除或者更新一条数据后,从表中的数据设置为NULL,通知
RESTRICT 主表删除主键,如果这个主键被子表引用,子表将会拒绝主表删除该数据
NO ACTION 在Mysql中与RESTRICT相同,子表会拒绝主表删除数据

外键约束是为了保证数据的完整性,一致性,当主表中被依赖的数据发生改变时,子表会根据提前的设定做相应的响应。主表在删除或者更新数据时,子表数据可能会相应变化;子表添加数据时,添加的外键值必须在主表中存在。

实体间联系

数据库的设计需要根据用户需求来建立数据关联模型,这些业务之间的联系可能会非常的复杂,就需要提前对这个数据建模。以员工和部门描述关系

关系 描述 解决方案
一对一 部门管理者对应一个部门 在管理者表或者部门表中建立外键均可
一对多 一个部门对应多个员工 在员工表中建立外键
多对多 一个员工属于多个部门,一个部门有多个员工 使用第三张表,使用两张表的主键作为联合主键并和原表建立外键,即可建立两张表的多对多联系
原文地址:https://www.cnblogs.com/k5210202/p/13073269.html