本篇文章所介绍的主要是针对关系数据库中概念数据模型和逻辑数据模型之间的转换。
一、码
首先,说明一下数据库中经常用到的用于标示一条记录(元组)的的码的概念,码又分为超码、候选码、主码。
超码:在一个关系中,可以用来唯一标识一个元组的属性的集合称之为超码。
候选码:在一个关系中,能够用来唯一标识一个元组的最少属性集合称之为候选码。
主码:在一个关系中,如果用来唯一标识一个元组的候选码中只有一个属性,则这个属性称之为主码。
三者之间的关系如下:超码是候选码的超集,候选码是主码的超集。下面以一个讲解清楚。假设一个关于学生信息的表格student,其中的属性有,stu_id(学号),name(姓名),age(年龄),address(地址)。那么超码可以由所有的属性组成的集合构成,例如(stu_id,name,age,adress)、(stu_id,name)、(stu_id,age)等都可以叫做student的超码;候选码为(stu_id);因为候选码只是由其中的一个属性组成,因此这个候选码又可以称之为主码。
二、概念数据模型到逻辑数据模型的转化(以关系数据模型为例)
前面博文讨论过,概念数据模型是用E-R图表示的,其中的三要素是实体、属性、联系。将概念数据模型转化为逻辑数据模型的步骤其实就是将E-R图中的各个部分转化为逻辑数据模型中使用的具体数据模型的各个部分。如果没有特别的交代,下面所说的逻辑数据模型指代的是关系数据模型。将概念数据模型转化为逻辑数据模型的大体规则如下:概念数据模型中的实体转化为逻辑数据模型中的关系,对应的实体的属性转化为关系数据模型关系的属性(也就是列);根据实体之间联系的不同具有不同的处置策略。
实体之间的联系分为1:1、1:n、和m:n。下面分别对这三种联系转化为关系的步骤做讨论。
1:1:这种关系是最好理解,同时也是最容易处理的关系。实体之间存在着一一对应的关系。在这种联系中,可以创建新的关系描述这种联系,这事将两个实体的主码作为新的关系的候选码;当然也可以不必创建新的关系,将一方关系的主码作为另一方关系的外键。例如两个关系A和B存在1:1联系,那么可以将A的主码作为B的外键,同时将B的主码作为A的外键,具体情况依据于具体的环境。以所做的红包的小练习为例,注册用户和账户之间存在着1:1的联系,用户管理者账户。E-R图如下:
图 1 用户与账户的E-R图
用户与账户之间存在一一对应关系,但是创建账户的时候需要用户已经存在,因此这种情况下需要将用户的"uid"作为账户的外键,那么对应的关系如下:
图 2 用户和账户的关系
因为,在这个例子中额外的创建关系会导致不必要的额外存储空间的增加,因此不再重新创建额外的关系。
1:n:一个实体可以对应额外的多个实体。这种联系中可以不必创建额外的关系表示二者之间的1:n的联系,此时只需要将“1”方的关系的主码放入到“n”方的关系的属性中作为其外键即可,同时将联系的属性加入到“n”方的关系中;当然也可以创建额外的关系表示二者之间的联系,那么“1”和“n”方的关系的主码作为候选码,同时将联系的属性加入到新建立的关系中。但是,这种情况下额外的创建新的关系显得冗余。还是以所练习的红包项目为例,一个大的红包根据指定的数值可以派生出很多的小红包。这两个实体分别对应着一个关系,其E-R图如下:
图 3 小红包的大红包的E-R图
由图3得知,小红包必须依赖大红包存在,因此在小红包中将大红包的bid作为小红包的外键即可,这样就不必建立额外的关系了。对应的关系如下:
图 4 大红包和小红包对应的关系
m:n:对于这种多对多的联系,必须建立新的关系以描述这种联系。“联系”对应的关系的属性中至少包含他说关联的双方实体的“主键”,若联系也有自身的属性,那么该属性一样纳入新建立的关系的属性中。由于红包项目中没有遇到类似的联系,因此以最经典的学生选课系统为例。很明显学生选课系统中的实体对应有学生和课程,一个学生可以选修多门课程,一门可能可被多个学生选修,因此两个实体之间是一种多对多的关系,对应的E-R图如下:
图 5 学生与课程多对多关系图
图 6 学生与课程对应关系
在上例中,学生与课程之间存在着多对多的联系,因此建立起新的选课关系来描述这种联系。在新的关系中将学生的主码和课程的主码作为选课的候选码,学生的主码和选课的主码的组合会出现在对应的选课关系中。如果此时要查询一个学生的成绩,需要使用联合查询的方式。
《数据科学与人工智能》公众号推荐朋友们学习和使用Python语言,需要加入Python语言群的,请扫码加我个人微信,备注【姓名-Python群】,我诚邀你入群,大家学习和分享。
关于Python语言,有任何问题或者想法,请留言或者加群讨论。