02.数据库设计相关知识

课程内容

实体、关系、属性 键码,码的分类 三种关系类型 数据库设计

课程目标

将自己要做的系统,设计好数据库,画出ER图

课程概要

实体与关系、属性

定义

  • 实体与关系 粗略理解:实体是名词,关系是动词。 在数据库中,无论实体还是关系,都以二维表的形式描述。

  • 属性 粗略理解:属性是形容词。 无论是实体还是关系,都能拥有属性。

举例

狗拿耗子,多管闲事
| |  |       |
| |  |       └关系中的属性
| |  └实体
| └关系
└实体

这里有两个实体:狗和耗子,可以继续抽象成一个实体:动物,也就是说实体可以与自身进行关系关联。

此外:如果我们对狗和耗子进行详细的描述,这些描述就是实体的属性。例如:动物表

id 名字 种类 颜色 体重
1 小白 5000g
2 阿灰 耗子 600g
3 大黄 5500g

码、键

定义

码也叫做键,超码也可以叫超键。码是==同一个==实体或关系中,==一个或多个==属性的集合。

* 超码
能保证唯一性的属性集合

* 候选码
能保证唯一性的最小属性集合

* 主码
候选码中选出的一个代表

    * 自然码
    自然存在的主码

    * 代理码
    设计时添加的没有实际意义的主码

* 外码
其他实体、关系的主码

举例

id 名字 种类 颜色 体重
1 小白 5000g
2 阿灰 耗子 600g
3 大黄 5500g

在上表中:id、名字、颜色、体重,都能唯一标识一行数据,结合概念理解:

  • 超码 包含id、名字、颜色、体重中任意一项属性的组合,比如:id+名字、名字+种类……

  • 候选码 上表有4个候选码:id、名字、颜色、体重

  • 主码 主码是由设计者从候选码中选择而出

    • 自然码 如果我们选择:名字、颜色、体重中的任意一项属性作为主码,那么这个主码就叫自然码。

    • 代理码 如果我们选择id作为主码,那么这个主码就叫代理码。

  • 外码 假设我们选定id作为动物表的主码,在关系表中的:==主语动物id==和==谓语动物id==就是外码。

    | 主语动物id | 动作 | 谓语动物id | 性质 | |--------|--------|--------|--------| | 1 | 拿 | 2 | 多管闲事 |

如上所述: 我们对码的分类是基于当前系统范围的,世界上可能有千千万万只狗叫小白、叫大黄,但是只要我们系统中名字能保证唯一,那么名字属性就是候选码。

如果我们把名字定为主码,那今后就不能有另一只叫做小白、大黄的==任何动物==进入到系统,所以主码选择必须慎重考虑。

在系统中,为了避免发生上述情况,我们往往选用==代理码==(一般是自增长id、guid)作为主码。在阿里的开发规范中,强制限定使用自增长id作为主码。

关系类型

一对一(1:1)

定义:一张表的一条记录只能与另外一张表的一条记录相对应,反之亦然。

举例:班级表和教师表,其中一种关系是班主任,就是一对一关系。即一个班级只能有一名班主任,一位教师也只能当然一个班级的班主任。

一对多、多对一(1:n)

定义:一张表中的记录可以对应另外一张表中的多条记录,但是反过来,另外一张表中的> 一条记录只能对应第一张表中的一条记录。

举例:班级表和学生表,他们之间的归属关系,就是一对多关系。即一个班级拥有多名学生,一名学生只能属于一个班级。

多对多(n:m)

定义:一张表中的记录可以对应另外一张表中的多条记录,反过来,另外一张表中的一条记录也可以对应第一张表中的多条记录。

举例:还是班级表和教师表,任课教师关系,就是多对多关系。即一名教师可以教授多个班级的课程,一个班级也需要多名教师来授课。

如上所述:

  1. 两个表之间,允许存在多种关系,每种关系可以是不同的类型。(班主任、任课教师)

  2. 对关系的判断分类,需要从左边看向右边,再从右边看回到左边。(从班级看向教师,再从教师看回到班级)

  3. 两个表之间,并不需要每一条数据都能建立关系。(班级、教师表的班主任关系,并不是每一名教师都是班主任)

  4. 上述例子中列举的都是两者之间的关系,实际情况中可能有三者或多者同时参与形成的关系。此时应取最复杂的关系类型(复杂度排序 1:1 < 1:n < n:m)

数据库设计

数据库和自然语言(汉语、英语等)都是为了存储、交换信息,有一定的共通性,所以设计数据库完全可以参考自然语言,试着用自然语言描述系统。接下来我们以课程表系统为例,示范一下数据库设计的基本步骤:

  1. 需求调研与分析

    为了完整的描述一个班级的课程表相关信息,我们至少需要使用下面两句话:

    三(1)班的语文老师是李四。 星期一上午第三节课是语文课。

  2. 抽取实体和关系

    三(1)班的语文老师是李四。

    任课教师:教师<-->班级<-->课程:多对多

    多实体(老师、班级、课程)参与的关系,如何确定类型:

    老师<-->班级:多对多 班级<-->课程:多对多 老师<-->课程:多对一(假设一位老师只教授一门课程)

    取最复杂的关系就得到多对多关系。

    星期一上午第三节课是语文课。

    课程安排:上课时间<-->任课教师:多对一

  3. 画ER图 将我们抽取出来的4个实体和1个关系,画成实体--关系图(ER图),通常使用方框表示实体、菱形表示关系、椭圆表示属性。

    graph LR;
     C[班级];D[教师];E[课程];F{任课教师};G{课程安排};H[上课时间]
     C-->F;
     D-->F;
     E-->F;
     F-->G;
     H-->G;
    

results matching ""

    No results matching ""