何为关系型数据库

 关系型数据库就是通过关系模型来建立的一种数据库,其能够很好的反映出各实体之间的关系,从而更将客观、科学的存储数据。

下面先说一说关系型数据库的一些概念和特点

  • 元   组

    在我们的数据库表格中,一行就可以看成是我们的元组,又可以看为一个实体,为什么呢? 我们可以从表格的每一列看,是不是每一列就代表实体的一个属性?综合起来是不是就可以看做一个实体了呢?元组的任意两行是不能相同的,为了标识,就引入了主键与符合主键的概念,等下再细讲。。。

oracle体系结构(1)---参照《oracle 11g 从入门到精通》_第二范式

 

 

  • 属   性  

    如上图,在数据库表格中的每一列就代表一个属性,属性是具有原子性的,即这个属性不可再分割,就如我们有个名字叫human的表格,我们可以加身高,体重为属性但是不能把身体作为属性,因为身体是包含身高,体重等属性的,可以再分割,不具备原子性。

  • 主键、复合主键、外键

    主        键:一个表格有多个决定其元组唯一的属性,我们称其为“候选码”,我们选取其中一个候选码,作为标识唯一性的主键。

    复合主键:主键是唯一的索引,通常会用GUID最为主键,但是并不是每个表都存在ID字段,例如学生表(姓名,生日,性别,班级),这里面每一个值都可能重复,无法使用单一字段作为主键,这时                                     我们可以将多个字段设置为复合主键,由复合主键标识唯一性。

    外       键:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。

  • 实体关系

    在现实生活中,不同实体之间有着不同的关系,比如说一个学生能被多个老师教,一个老师能教多个学生,那么,学生和老师之间就形成了多对多的关系,这只是其中的一种关系。

    一对一:对于实体集A中的每一个实体,在B中最多只有一个实体能和他对应,反之亦然,这就说明A和B具有一对一的关系

    一对多:对于实体集A中的每一个实体,在B中多个实体能和他对应;而对于实体集B中的每一个实体,在A中最多只有一个实体能和他对应,这就说明具有一对多的关系

    多对多:对于实体集A中的每一个实体,在B中多个实体能和他对应;对于实体集B中的每一个实体,在A中多个实体能和他对应,这就说明有多对多的关系。

  • 三大范式

    借用连接 http://c.biancheng.net/view/8266.html

    下面以某酒店的客人住宿信息表为例来介绍,该表用于保存酒店提供住宿的客房信息,如表 1 所示。

表 1 客人住宿信息表
客人编号 姓名 地址 客房号 ... 客房描述 客房类型 客房状态 床位数 价格 入住人数
C1001 张三 Addr1 1001 ... A栋1层 单人间 入住 1 128.00 1
C1002 李四 Addr2 2002 ... B栋2层 标准间 入住 2 158.00 2
C1003 王五 Addr3 2002 ... B栋2层 标准间 入住 2 168.00 2
... ... ... ... ... ... ... ... ... ... ...
C8006 A1 Addrm 8006 ... C栋3层 总统套房 入住 3 1080.00 3
C8008 A2 Addrn 8008 ... C栋3层 总统套房 空闲 3 1080.00 0

 

      1. 信息重复(冗余)

        上表中“客房类型”“客房状态”和“床位数”列中有许多重复的信息,如“标准间”“入住”等。信息重复会造成存储空间的浪费及一些其他的问题。比如,不小心输入了“标准间”和“标间”或“总统套房”和                         “总统套”,那么它们在数据库中将表示四种不同的客房类型。

      2. 更新异常

        冗余信息不仅浪费存储空间,还会增加更新的难度。如果需要将“客房类型”修改为“标间”而不是“标准间”,则需要修改所有包含该值的行。如果由于某种原因,没有更新所有行,那么数据库中会                       出现两种客房类型,一个是“标准间”,另一个是“标间”,这种情况被称为更新异常。

      3. 插入异常(无法表示某些信息)

        从表 1 中我们会发现 2002 和 2003 客房的居住价格分别是 168 元和 158 元。尽管这两间客房都是标准间类型,但它们的“价格”出现了不同,这样就造成了同一个酒店相同类型的客房价格不                            同,这种问题被称为插入异常。

      4. 删除异常(丢失有用的信息)

        在某些情况下,当删除一行时,可能会丢失有用的信息。例如,如果删除客房类型为“1001”的行,就会丢失客房类型为“单人间”的账户的信息,该表只剩下两种客房类型,即“标准间”和“总统套                         房”。当查询有哪些客房类型时,将会误以为只有“标准间”和“总统套房”两种客房类型,这种情况被称为删除异常。

  基于这写情况,就研究出了三大范式

    第一范式:用通俗的话来说就是属性不可再分割,要有原子性。

    第二范式:在第一范式的基础上,有新增了实体属性,完全依赖于主属性的规则。举个例子:https://baike.baidu.com/item/第二范式/3193760?fr=aladdin

        不符合第二范式的例子

货物类型
货物ID
货物名称
注意事项
瓷碗
1
白色瓷碗
易碎品
瓷碗
2
青花瓷碗
易碎品
瓷碗
3
雕花瓷碗
易碎品
三合板
4
普通三合板
易燃物品,注意防火
 
在该表中主键为(货物类型,货物ID),货物名称字段完全依赖于这个主键,换句话说,货物的名称完全是取决于这个主键的值的。但“注意事项”这一列,仅依赖于一个主键中”货物类型“这一个属性。简单地说,第二范式要求每个非主属性完全依赖于主键,而不是仅依赖于其中一部分属性。那么,既然表中存在一个对主键不是完全依赖的字段,那么我们就可以确定,该表不符合第二范式
 
       符合第二范式的例子
货物类型
货物ID
货物名称
瓷碗
1
白色瓷碗
瓷碗
2
青花瓷碗
瓷碗
3
雕花瓷碗
三合板
4
普通三合板
 
在该表中的主键依然是(货物类型、货物ID),非主键字段“货物名称”,完全依赖于这两个主键,那么我们就可以说,该表是符合数据库第二范式的。
 
总结于2021-09-01