首页 > 其他分享 >数据模型《实体联系模型》

数据模型《实体联系模型》

时间:2023-06-01 22:34:08浏览次数:49  
标签:... 联系 模型 实体 course 主码 数据模型 属性

1. 需求分析阶段:根据"软件需求规则说明书"生成 er模型

2. 概念结构阶段:根据"转换规则"把ER模型 转成关系模型

3.逻辑结构设计阶段: 根据"三范式"规则(要求) 把关系模型 转换成 基本表

实体-联系模型#

基本概念#

  • 实体:实体是有别于其他对象的一个事物,比如人,教师,学生,课程,专业。

  • 实体集:一系列实体组成的集合,在数据库中对应的就是一个表。

  • 属性:一组属性构成一个实体,比如学生可能具有学号,姓名,年龄等属性。每个实体中的属性都有一个值。

    所以一个数据库中包含若干个实体集,每个实体集中有若干个实体,每个实体中有一些属性。

  • 联系:多个实体之间相互关联,比如教师Katz和学生Shankar可能存在一个联系advisor,表示Katz是Shankar的老师

  • 联系集:相同类型联系的集合。如果E1,E2,E3,...,En�1,�2,�3,...,��是实体集,联系集R是如下集合的一个子集,n>=2,(e1,e2,...,en)�>=2,(�1,�2,...,��)是其中的一个联系。

     

    {(e1,e2,...,en)|e1∈E1,e2∈E2,...,en∈En}{(�1,�2,...,��)|�1∈�1,�2∈�2,...,��∈��}

     

    说白了,联系集就是咱们用数据库时建的那些用来联系两个表的表,比如选课表用来联系学生和课程之间的一个关系。而这个联系用数学表示就是(student_id,course_id)(�������_��,������_��),所有这些元组就组成了联系集{(student_id,course_id)|student_id∈student,course_id∈course}{(�������_��,������_��)|�������_��∈�������,������_��∈������},也就是选课表。

  • 参与:实体集之间的关联称为参与,比如一个学生Shankar和一门课程Comp. Sci.共同参与到选课这个联系中。

  • 联系实例:两个实体集中的实体参与到一个联系中时,就构成了一个联系实例,比如学生Shankar选了Comp. Sci.课程,那么它们就构成了选课联系中的一个联系实例。

  • 角色:实体在联系中充当的功能。

  • 描述性属性:联系中可以具有一些描述性属性,比如通过一个date来记录学生在何时选了一门课。

  • 联系集的度:参与联系集的实体集个数,一般情况下联系集的度为2,称为二元联系集。

属性#

简单属性和复合属性#

之前的属性都是简单属性,就是只有一个值的属性,复合属性可以继续划分称更小的属性。

比如name可以划分为first_name,middle_name和last_name。

复合属性是可以嵌套的,例如下面的address可以划分为street,city等属性,而street又可以划分为street_number、street_name、apartment_number属性

单值属性和多值属性#

有的属性只有一个值,比如一个人的age,只能有一个,不存在一个人有多个年龄,而电话号,一个人可以有多个。

多值属性用花括号扩起,比如{phone_number}

派生属性#

可以通过其他相关属性计算出来,比如教师有一个属性是教了多少学生,这个可以根据教师关联的学生数统计出来。

再比如用户有birth字段代表他的生日,那么age字段就可以是一个派生属性,因为它可以从birth推算出来。

映射基数#

映射基数是一个实体能通过联系集映射实体的个数。

  • 一对一:A中的一个实体最多只能与B中的一个实体相关联,B中的一个实体最多也只能与A中的一个实体相关联。
  • 一对多:A中的一个实体可以与B中的多个实体相关联,B中的一个实体至多与A中的一个实体相关联。
  • 多对一:A中的多个实体之多与B中的一个实体相关联,B中的一个实体可以与A中的多个实体相关联。
  • 多对多:A中的实体可以与B的多个实体相关联,B中的多个实体也可以与A的多个实体相关联。

参与约束#

如果实体集E中的每个实体都参与到联系集R中,称E在R中的参与是全部的。如果非全部,则称部分的

我们希望每个学生都参与到advisor联系中,这证明它们都有一个老师,而对于老师它们并不一定都参与到advisor中,因为有的老师可能不教学生,而是从事一些学校的其他工作。

#

和关系中的码概念一致。

设R是涉及实体集E1,E2,...,En�1,�2,...,��的联系集,若实体集中的主码属性名互不相同,那么:

 

primary−key(E1)∪primary−key(E2)∪...∪primary−key(En)∪a1,a2,...,an�������−���(�1)∪�������−���(�2)∪...∪�������−���(��)∪�1,�2,...,��

 

构成了联系集R中的一个联系,primary−key(E)�������−���(�)代表实体集E中的主码,a1,a2,...,an�1,�2,...,��是联系集自有的描述性属性。

意思就是,参与联系集的所有实体集的主码和联系集自有的所有属性构成了联系集中的一个联系。

不管怎样,以下属性集合代表了联系集的一个超码

 

primary−key(E1)∪primary−key(E2)∪...∪primary−key(En)�������−���(�1)∪�������−���(�2)∪...∪�������−���(��)

 

联系集的主码结构依赖于联系集的映射基数。比如advisor联系集是学生到他的老师的联系,如果是多对多关系,那么只有学生的主码和老师的主码的并集能组成联系集的主码。而如果一个学生只有一个老师,那么学生的主码足以表示联系集的主码。如果老师和学生是多对一关系,那么老师(多的一方)即可作为联系集的主码。

删除冗余属性#

之前的大学系统里,有很多冗余属性。

比如instructor中有dept_namedepartment中也有dept_name,二者的联系通过instructor中的一个字段来表现。

这样也会出现一些问题,我们没法表示一个还没有所在系的教师,我们没法表示有两个所在系的教师等。

它们两个之间的联系应该通过一个联系集来定义。

inst_dept (ID, dept_name)

inst_dept存储了来自两个实体集instructordept_name的联系集。现在,我们可以从instructor中删除dept_name字段。

经过删除冗余属性并创建联系集表,我们得到了如下的大学数据库关系模型。

实体集

联系集

实体联系图(ER图)#

基本结构#

  • 分成两部分的矩形代表实体集,上面是实体集的名字,下面是属性名
  • 菱形代表联系集
  • 未分割的矩形代表联系集的属性
  • 下划线标注的属性是主码
  • 线段将实体集连接到联系集
  • 虚线将联系集属性属性连接到联系集
  • 双线显示实体在联系集中的参与度
  • 双菱线代表连接到弱实体集的标志性联系集

映射基数#

使用带箭头的线段代表一,不带箭头的线段代表多。

如果想对映射基数做更细致的限制,可以使用l..h来指定双方最少最多有多少个实体参与映射。

l..h左边的数为1时,代表该实体集中每个实体最少参与一次联系,也就是说该实体集全部参与联系。当右面为*时,代表该实体集中的每个实体可以参与任意多次联系。

上图的instructor代表教师可以有任意多个学生(也可以没有),所以instructorstudent是一对多联系。而student最少和最多都只能参与一次联系,这证明学生必须有一个老师且只能有一个老师。student在联系advisor中的参与是全部的。

这种关系可以使用从student画一条到advisor的双线,并且从advisor画到instructor的箭头实线来代表7-10中的关系。

复杂的属性#

上图是如何在ER图中表示复合属性、多值属性和派生属性的示例。

nameaddressstreet都是复合属性,{phone_number}是多值属性、age()是派生属性。

角色#

一般情况下,联系集包含被联系表的主码的并集,而且这些主码名字不相同,所以我们不用显式指定角色就能够分辨。

下面这个情况就不行了,prereq代表从coursecourse的一个联系集,用来说明两门课程之间的先修关系。

这时,联系集是由相同的两个实体构成的,它们的主码是一致的,我们没法分辨哪个是哪个,所以可以在连线上通过文字来给参与联系的实体集中的实体赋予一个角色,下图赋予了course_idprereq_id的角色。

弱实体集#

比如section开课实体,它有course_id, semester, year组成,就是课程编号,学期,学年。section中的所有属性构成了section的主码,它们才能唯一确定一个选课,但如果这时你想要创建一个section实体到course实体的联系sec_course,你会发现sec_course的信息是冗余的,但如果不创建这个联系,又会让二者的联系隐含section实体集的一个属性中,这让我们的ER图不清晰。

消除冗余的办法就是在section中不保存course_id,放到sec_course中。然后现在,section实体便不具有能够唯一标识自己的码了,而是通过联系集sec_coursesection提供唯一标识自己的额外信息。这种不具有能够形成主码的属性的实体集称为弱实体集(weak entity set)。

注意,这里之前我看的很迷糊,有很多问题,比如:

  • sec_course是如何和section联系上的
  • 这种结构如何在数据库中实现

其实ER图不代表最终数据库中的结构,数据库中的结构还是最开始那样从section种存储course_id,而ER图为了将数据库结构以清晰的方式表述出来,所以才引入弱实体集的概念,否则很难以在图中看出section实体集与course实体集有关联。

有主码的实体集称为强实体集(strong entity set)

弱实体集必须与一个强实体集产生关联才有意义,就比如section必须和course关联才有意义,这个强实体集称作标识(identifying),或属主实体集(owner entity set)

可以说弱实体集存在依赖(existence dependent)于标识实体集,标识实体集拥有(own)它所标识的弱实体集,将弱实体集与其标识实体集相联系的联系称为标识性联系(identifying relationship)

弱实体集中的属性,在刚刚的例子中是semester, year称作弱实体集的分辨符,它们虽不能标识唯一的一次开课,但也在联系中起到了一定的分辨作用,比如同一门课在不同时间的开课,分辨符构成了弱实体集的部分码,弱实体集的主码由标识实体集主码加上弱实体集部分码组成,也就是course_id, semester, year

如下是弱实体集在ER图中的画法

  • 弱实体集的分辨符用虚线标注(第一个分辨符我划掉了,怕难以理解)
  • 标识性联系用菱形双线绘制。

这个图还表明了弱实体集在联系中是全部参与的,因为弱实体只有关联到强实体才有意义,一门没关联到任何课程的开课信息有什么意义?

大学系统的ER图#

转换为关系模式#

强实体集#

简单属性#

直接转换,主码一致

复合属性#

把复合属性依次展开,比如name展开后就是first_namemiddle_initiallast_name,并且复合属性本身并不会出现在关系模式中

多值属性#

多值属性需要创建新的关系模式,比如教师可以有多个手机号,那就要创建出一个新的关系模式instructor_phone,它的主码由所有属性组成,ID是参照instructor的外键

弱实体集#

弱实体集的模式由它所依赖的标识实体集的主码和自身的分辨符组成。标识实体集的主码是弱实体集的一个外码。

弱实体集与强实体集之间的联系集在关系模式中是冗余的,不必给出。

联系集#

联系集确定主码:

  1. 多对多的二元联系,两个实体集的主码并集成为联系集主码
  2. 一对一的二元联系,两个实体集任意一个主码成为联系集主码
  3. 一对多或多对一的二元联系,参与联系中“多”的那一方的主码成为联系集的主码
  4. 没有箭头的n元联系集,所有实体集的主码并集成为联系集主码
  5. 有一个箭头的n元联系集,不被箭头所指的所有实体集的主码并集成为联系集的主码

参与联系的实体集的主码都会变成联系集的外码。

模式合并#

在一对一的情况下,如果实体集A,B以及二者的联系集AB中,A全部参与AB,那么可以将A和AB合并成一个模式。

比如inst_dept记录所有教员的系,教员必定有一个所在系,所以instructorinst_dept中全部参与,那么可以将实体集和联系集合并,得到{ID, name, dept_name, salary}

然后,联系集上的外码约束移动到了合并后的关系模式上。

作者:Yudoge

出处:https://www.cnblogs.com/lilpig/p/15431749.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

欢迎按协议规定转载,方便的话,发个站内信给我嗷~

标签:...,联系,模型,实体,course,主码,数据模型,属性
From: https://www.cnblogs.com/ko25891wan/p/17450442.html

相关文章

  • 模型推理 结果不一致
    背景:1、固定网络部分,微调另外一部分,固定部分包含bn2、网络的fix部分和训练部分封装到一个nn.Module中3、训练过程有推理,在推理的时候Module切换到eval(),推理完Module又切换到train()现象:最原始现象是模型训练完,加载训练完的模型,精度和训练最后的训练精度对不上分析过程:1、......
  • volatile与java内存模型
    一、结论先说结论,volatile能保证可见性和有序性,不能保证原子性。二、volatile的内存语义当写一个volatile变量时,会将变量值刷新回主内存当读一个volatile变更时,会从主内存中读取最新值三、内存屏障是什么?内存屏障是一类同步屏障指令,是cpu或编译器在对内存随机访问操作的一......
  • 二级指针内存模型
    二级指针做输出模型#define_CRT_SECURE_NO_WARNINGS#include<stdlib.h>#include<string.h>#include<stdio.h>//指针做输出:被调用函数分配内存-----OK//指针做输入:主调用函数分配内存//求文件中的两段话的长度intgetMem(char**myp1,int*mylen1,char**myp2,in......
  • 深入探索C++对象模型(十一)执行期语义学(临时对象)
    关于临时对象的几条准则。1. 在某些情况下,编译器可以产生必要的,或者可以带来方便的临时对象,具体行为由编译器来定义。例如,对于如下操作:1.Ta,b;2.Tc=a+b;//Toperator+(constT&,constT&)a.编译器会产生一个临时对象,放置a+b的结果,然后使用T的拷贝构造函数,把临时......
  • 吴恩达教授AI课程:LangChain、扩散模型,用ChatGPT API搭建系统
    家人们,吴恩达教授的AI课程时隔一个月终于又更新了!这次一口气直接推出了三门课,主题包括LangChain、扩散模型,以及用ChatGPTAPI搭建系统。依旧是限时免费,除了扩散模型需要一定知识储备之外,另外两门课新手也能听。有网友为了看完这些课程,直接连觉都不睡了。课程内容这三门课的......
  • 通义千问预体验,如何让 AI 模型应用“奔跑”在函数计算上?
    立即体验基于函数计算部署通义千问预体验:https://developer.aliyun.com/topic/aigc_fcAIGC浪潮已来,从文字生成到图片生成,AIGC的创造力让人惊叹,更多人开始探索如何使用AI提高生产效率,激发更多创作潜能,然而在实际应用中,AI技术的高门槛仍然让很多人望而却步,普通开发者或者没有......
  • Blender导出的模型和kanzi坐标轴匹配的设置方法
    1、blender里的导出配置 要改成Y向上,Z向前。 2、kanzi里摄像机的参数归0,然后导入的模型 各项参数也都归0,这样调整的角度就都是一致的。 ......
  • 分布式队列编程:模型、实战
    介绍作为一种基础的抽象数据结构,队列被广泛应用在各类编程中。大数据时代对跨进程、跨机器的通讯提出了更高的要求,和以往相比,分布式队列编程的运用几乎已无处不在。但是,这种常见的基础性的事物往往容易被忽视,使用者往往会忽视两点:使用分布式队列的时候,没有意识到它是队列。有具体需......
  • 机器学习模型优化:variance bias
    bias(偏差:指同一个点的训练数据的预测值与正确值间的偏离程度)variance(方差:指同一个点的训练数据的预测值的离散程度) 一般情况下,模型需要在bias和variance之间取得一个平衡。bias小的模型,variance一般大;variance小的模型,bias一般大。更好的理解bias和variance的关系能够帮助我们......
  • UE4添加人物模型
    在正式使用UE4添加人物模型之前,我们先来解释几个概念。什么是组件在添加人物模型之前先介绍一个概念叫“组件”,组件是什么呢?组件的作用是为了让Actor实现一个功能,比如说:我们现在的角色,没有模型,我们需要一个模型那怎么办呢?那么我就要在Character身上挂一个“骨骼模型组件”......