Mysql系列——数据库设计(4)——实体表之间的关系

干软件这一行这么多年,发现好的程序员也更加的好学。

大学时代,舍友放过一个影片,对其中的六度理论印象很深刻。

*六度人脉关系理论(Six Degrees of Separation),是指地球上所有的人都可以通过六层以内的熟人链和
任何其他人联系起来。通俗地讲:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过六个人你就能够认识任何一个陌生人。”*

我们很容易明白,六度理论的数学基础是级数。m^n是一个很大的数字,几乎能够快速到达每一个人。
Mysql系列——数据库设计(4)——实体表之间的关系_第1张图片 图片来自网络

从中也可以看出,越是复杂的关系软件系统的复杂度越高。这里复杂度包括了数据库关系、代码结构。因此前辈们才会整理出数据库设计理论、设计模式理论等。而这其中 M:N(多对多)、1:M(一对多)、1:1(一对一)的复杂度是由高到低的。这里说的多对多等就是今天要讲的实体表之间的关系。

软件开发在开始的时候,项目经理们喜欢用建筑工程的理论来思考软件系统。因此也衍生出瀑布开发模式,瀑布开发模式将系统开发分为可行性分析、概要设计、详细设计等诸多阶段,许多公司没有严格参照这个流程设计开发系统,但是数据库设计都会有一个设计审核的过程。它属于详细设计的一个阶段,这个时候系统的需求已经明晰(暂且不要提敏捷先生,他在另外一个房间喝茶,正在思索是否要邀请瀑布阁下过去呢)。

数据库设计中一个重要的过程就是画ER图的过程,ER图(Entity Relationship Diagram)即实体-联系图,其中的E已经在前面说过,只要满足第三范式就可以了。而且中的R就是今天要探讨的话题。

Mysql系列——数据库设计(4)——实体表之间的关系_第2张图片 摘自网络

在上图中,直角矩形代表实体,菱形代表关系。而圆角矩形代表的则是实体与关系的属性。在实际设计过程中,一般先只画直角矩形与菱形,在细化的过程中再画上圆角矩形。也就是说先摸清枝干,再抓叶子。

Mysql系列——数据库设计(4)——实体表之间的关系_第3张图片

有一个规律性的小技巧,一般来说实体表示某一个相对固定的对象,比如讲师、学生、课程,以及商品、订单等。而关系则表示某一个活动或者隶属关系,比如就职于、学习、教授等相对抽象的活动。

那么怎样判断某对实体之间的关系属于多对多、一对多、一对一呢?是这样一个过程,想想一下:
A实体与B实体,在这个活动或者隶属关系中,之间的位置关系数目。
如上图中:

讲师在教授活动中,一位讲师教授几门课程呢?答案是多门,因此这一方是1:M关系,那么反过来一门课程由几位讲师教授呢?在此,答案是一位讲师。因此是1:1的关系,那么他们相互之间的关系就是1:M(一对多)。如果这里,某些门课程难度很大,请了多位讲师讲解,这时第二个问题,答案就是多位讲师,因此是1:N的关系,那么这里就会编程M:N(多对多的关系)。

同样,学生学习课程的关系中。首先发问,一位学生学习几门课程呢?答案是N门,因此是1:N关系。同时反过来一门课程被几位同学学习呢?答案是多位同学。因此是1:M的关系,因此他们交叉后关系就是M:N(多对多)。如果这里架设是古代的贵族私塾制度,一门课程只有一位学生,那么上述第二个问题,答案就是一位同学学习,就变成了1:1关系,那么交叉后就是1:N(一对多关系)了。

这里,小结一下:

在某个活动中,A与B之间关系。假设A为主语地位,首先发问,在这个活动中A为主导时,一个A要操作几个B呢?再发问如果B为主语地位,一个B被几个A操作呢?
**上述答案画一个表格:

A为主语问题答案 B为主语问题答案 A:B
1:1 1:N N:1
1:1 1:1 1:1
1:M 1:N N:M

那么怎样在数据表中用字段表示这种关系呢?

如果是M:N关系,只能独立一个关系表表示这种关系,并且这次活动中如果有额外属性直接写在关系中。

如图中,学生学习课程这个活动中,用学习关系表来表示之间的M:N(多对多)关系,因为有成绩这个额外属性,因此在这里放在学习这个关系表中:
Mysql系列——数据库设计(4)——实体表之间的关系_第4张图片

这时候学习关系表的表结构如下:

字段名称 说明
学生id 学生表主键
课程id 课程表主键
成绩 考试成绩

如果是1:M活动关系:

如果这种关系恒定,并且没有额外的活动属性的,那么将1端的Id可以放在M端表示这种关系。比如,某一个小学,这位老师打算一直在这里从教,教授这些孩子们做人的道理。改变他们的命运,那么课程与教师这种关系很稳定,而且大多数软件系统比人类的寿命要短暂。那么这里可以在课程这里加上教师的id表示这种教授活动关系:

Mysql系列——数据库设计(4)——实体表之间的关系_第5张图片

如果课程所属的教师经常变动,如经常性的教师离职等造成这种教授活动不恒定。这种情况下还是独立一个关系表更加灵活些:

Mysql系列——数据库设计(4)——实体表之间的关系_第6张图片

最后,如果是1:1关系,那么可以在任意一段放置对方的id表示这种关系。

这个时候,上述的id都被称为外键。

值得一提的是,这些外键经常被作为索引的候选字段,后续课程中讲解索引的时候会探讨这个专题。

感谢您的耐心阅读,今天是周末,出去走走吧。毕竟多走路,不仅对健康、事业有利,也能找到更加靠谱的对象呀,您说呢?

你可能感兴趣的:(数据库设计)