关系型数据库

关系型数据库

简介

  • 一种基于关系模型的数据库,将实体间的关系通过关系模型表达出来。
  • 所谓关系模型,就是"一对一、一对多、多对多"等关系模型,就是指二维表格模型,由二维表格和它们之间的联系组成的一个数据组织。
  • 关系模型包括:数据结构、操作指令集合(SQL语句)、完整性约束(表内数据约束、表之间的约束) 关系型数据库是以"一行"作为一条记录。

特点

a、安全:数据存储在磁盘中,断电保护;
b、易理解(建立在关系模型上)
c、不节省空间(关系模型,需要遵循规则,字段为空也要分配空间)

非关系型数据库

  • 常见非关系模型数据库:
    1、列模型Hbase;
    2、键值对模型:redis、MemcacheDB;
    3、文档类模型:mongoDB)
  • 特点:
    a、高效(数据存在内存中)
    b、不安全(断电数据丢失,redis可同步数据到磁盘)。

数据模型

数据库按照数据结构来组织、存储和管理数,数据库共有以下三种模型:
层次

  • 层次模型(树状)
  • 网状模型
  • 关系模型
    关系模型把数据看作一个二维表格,通过行号+列号来唯一确定一条数。相比层次模型和网状模型,关系模型使用和理解最为简单。

基于数学理论的关系模型虽然讲起来挺复杂,但是,基于日常生活的关系模型却十分容易理解。我们以学校班级为例,一个班级的学生就可以用一个表格存起来,并且定义如下:
学生表
其中,班级ID对应着另一个班级表:
班级表
学生表和班级表通过class_id关联,通过班级id,可以查询到一条班级记录,也可以查询班级id对应的所有学生记录。

在关系型数据库中,一张表中的每一行数据被称为一条记录,由多个字段组成,同一张表的所有记录都有相同的字段定义。

主键

对于关系表,有个很重要的约束,即:任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键,通常用id作为主键以区分不同的记录。

选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。

因此,身份证号、手机号、邮箱地址这些看上去可以唯一的字段,均不可用作主键。

作为主键最好是完全业务无关的字段,我们一般把这个字段命名为id。常见的可作为id字段的类型有:

  • 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键;
  • 全局唯一GUID类型:使用一种全局唯一的字符串作为主键,类似8f55d96b-8acc-4636-8cb8-76bf8abc2f57。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,可以自己预算出主键。

联合主键

关系型数据库还允许通过多个字段唯一标识记录,即两个或更多字段设置为主键,这种主键被称为’联合主键’。
对于联合主键,允许一列由重复,只要不是所有主键列都重复即可:
联合主键
如果我们把上述表的id_num和id_type这两列作为联合主键,那么上面的3条记录都是允许的,因为没有两列主键组合起来是相同的。

没有必要的情况下,我们尽量不使用联合主键,因为它给关系表带来了复杂度的上升。

总结
主键是关系表中记录的唯一标识。主键的选取非常重要:主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL。

可以使用多个列作为联合主键,但联合主键并不常用。

外键

由于一个班级可以有多个学生,在关系模型中,这两个表的关系可以称为“一对多”,即一个classes的记录可以对应多个students表的记录。

为了表达这种一对多的关系,我们需要在students表中加入一列class_id,让它的值与classes表的某条记录相对应:
外键
如此,通过class_id即可定位出students表某条记录对应到classes表的哪条记录(即:某个id的学生所属班级的信息)

在students表中,通过class_id的字段,可以把数据与另一张表关联起来,这种列称为外键
外键并不是通过列名实现的,而是通过定义外键约束实现的:

ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes (id);

其中,外键约束的名称fk_class_id可以任意,FOREIGN KEY (class_id)指定了class_id作为外键,REFERENCES classes (id)指定了这个外键将关联到classes表的id列(即classes表的主键)。

通过定义外键约束,关系数据库可以保证无法插入无效的数据。即如果classes表不存在id=99的记录,students表就无法插入class_id=99的记录。

由于外键约束会降低数据库的性能,大部分互联网应用程序为了追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。这种情况下,class_id仅仅是一个普通的列,只是它起到了外键的作用而已。

要删除一个外键约束,也是通过ALTER TABLE实现的:

ALTER TABLE students
DROP FOREIGN KEY fk_class_id;

注意:删除外键约束并没有删除外键这一列。删除列是通过DROP COLUMN …实现的。

一对一

一对一关系是指:一个表的记录对应到另一个表的唯一一个记录。

例如,students表的每个学生可以有自己的联系方式,如果把联系方式存入另一个表contacts,我们就可以得到一个“一对一”关系:
联系方式表

多对多

通过一个表的外键关联到另一个表,我们可以定义出一对多关系。有些时候,还需要定义“多对多”关系。例如,一个老师可以对应多个班级,一个班级也可以对应多个老师,因此,班级表和老师表存在多对多关系。

多对多关系实际上是通过两个一对多关系实现的,即通过一个中间表,关联两个一对多关系,就形成了多对多关系:
老师、班级表
中间表teacher_class关联两个一对多关系:
中间表
一个老师,对应多个班级;同理,一个班级,对应有多个老师。

索引

索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过索引,可以让数据库系统不必扫描整个表,而直接定位到符合条件的记录,加快了查询速度。
学生表成绩排序
如果要经常根据score列进行查询,就可以对score列创建索引:

ALTER TABLE students
ADD INDEX idx_score (score);

创建一个名为"idx_score",使用列score的索引。索引名称是任意的,多列索引,可在括号内依次添加,使用","进行分隔。

索引效率取决于索引列的值是否为散列,即:列的值越互不相同,索引效率越高,反之,如果记录的列存在大量相同值,对这样的列创建索引则没有意义。
对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。

无论是否创建索引,对数据库的使用不会有任何影响。索引的意义在于:数据库查询时,如果有相应的索引可用,可以提高查询效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值