草庐IT

实体关系 (ER) 图的几种不同风格的符号

allway2 2023-04-09 原文

什么是 ER 图?

实体关系 (ER) 图是一种流程图,用于说明“实体”(如人、对象或概念)如何在系统中相互关联。ER 图最常用于设计或调试软件工程、商业信息系统、教育和研究领域的关系数据库。也称为 ERD 或 ER 模型,它们使用一组定义的符号,如矩形、菱形、椭圆形和连接线来描绘实体、关系及其属性的相互联系。它们反映了语法结构,实体作为名词,关系作为动词。

ER 图与数据结构图 (DSD) 相关,后者侧重于实体内元素的关系,而不是实体本身之间的关系。ER 图还经常与数据流图 (DFD) 结合使用,后者绘制流程或系统的信息流。

ER 模型的历史

Peter Chen(又名Peter Pin-Shan Chen)目前是匹兹堡卡内基梅隆大学的教员,因在1970年代为数据库设计开发ER建模而受到赞誉。在麻省理工学院斯隆管理学院担任助理教授期间,他于1976年发表了一篇开创性的论文,题为“实体关系模型:迈向数据的统一视图”。

从更广泛的意义上讲,对事物相互联系的描述可以追溯到最不古希腊的亚里士多德、苏格拉底和柏拉图的作品。最近在19世纪和20世纪哲学家逻辑学家的著作中可以看到这一点,如查尔斯·桑德斯·皮尔斯(Charles Sanders Peirce)和戈特洛布·弗雷格(Gottlob Frege)。

到1960年代和1970年代,查尔斯·巴赫曼(上图)和A.P.G.布朗与陈的方法的亲密前辈合作。巴赫曼开发了一种数据结构图,以他的名字命名为巴赫曼图。布朗发表了关于现实世界系统建模的著作。詹姆斯·马丁增加了ERD的改进。Chen,Bachman,Brown,Martin等人的工作也为统一建模语言(UML)的发展做出了贡献,该语言广泛用于软件设计。

实体关系图的使用

  • 数据库设计:ER 图用于在逻辑和业务规则(在逻辑数据模型中)以及要实现的特定技术(在物理数据模型中)方面对关系数据库进行建模和设计。在软件工程中,ER 图通常是确定信息系统项目需求的第一步。它稍后还用于对一个或多个特定数据库进行建模。关系数据库具有等效的关系表,并且可以根据需要以这种方式表示。

  • 数据库故障排除:ER 图用于分析现有数据库,以查找和解决逻辑或部署中的问题。绘制图表应该揭示出错的地方。

  • 业务信息系统:这些关系图用于设计或分析业务流程中使用的关系数据库。任何使用涉及实体、操作和相互作用的现场数据的业务流程都可能从关系数据库中受益。它可以简化流程,更轻松地发现信息并改善结果。

  • 业务流程再造:ER 图有助于分析业务流程重新设计中使用的数据库以及为新的数据库设置建模。

  • 教育:数据库是当今存储关系信息以用于教育目的和以后检索的方法,因此 ER 图在规划这些数据结构方面很有价值。

  • 研究:由于如此多的研究都集中在结构化数据上,因此ER图可以在建立有用的数据库来分析数据方面发挥关键作用。

ER 图的组件和功能

ER 图由实体、关系和属性组成。它们还描绘了基数,它用数字来定义关系。以下是词汇表:

实体

可定义的事物(例如人、对象、概念或事件),可以存储有关它的数据。将实体视为名词。示例:客户、学生、汽车或产品。通常显示为矩形。

实体类型:一组可定义的事物,例如学生或运动员,而实体将是特定的学生或运动员。其他示例:客户、汽车或产品。

实体集:与实体类型相同,但在特定时间点定义,例如第一天注册课程的学生。其他例子:上个月购买的客户,目前在佛罗里达州注册的汽车。相关术语是实例,其中特定的人或汽车将是实体集的实例。

实体类别:实体分为强、弱或关联。强实体可以仅由其自身的属性定义,而弱实体则不能。关联实体关联实体集中的实体(或元素)。

实体键:引用唯一定义实体集中的实体的属性。实体键可以是超级键、候选键或主键。超级键:一组属性(一个或多个),它们共同定义实体集中的实体。候选密钥:最小超级键,这意味着它具有尽可能少的属性数,仍然是超级键。一个实体集可以有多个候选键。主键:数据库设计者选择的用于唯一标识实体集的候选键。外键:标识实体之间的关系。

关系

实体如何相互作用或相互关联。将关系视为动词。例如,指定的学生可能会注册课程。这两个实体将是学生和课程,所描述的关系是注册的行为,以这种方式连接两个实体。关系通常直接在连接线上显示为菱形或标签。

递归关系:同一实体多次参与关系。

属性

实体的属性或特征。通常显示为椭圆形或圆形。

描述性属性:关系(相对于实体)的属性或特征。

属性类别:属性分为简单属性、复合属性、派生属性以及单值或多值属性。简单:表示属性值是原子的,不能进一步划分,例如电话号码。复合:子属性源于属性。派生:归因是计算或以其他方式派生自其他属性,例如出生日期的年龄。

多值:表示多个属性值,例如一个人的多个电话号码。

单值:只有一个属性值。这些类型可以组合,例如:简单单值属性或复合多值属性。

基数

定义两个实体或实体集之间关系的数值属性。三种主要的基本关系是一对一、一对多和多对多。一对一的例子是与一个邮寄地址关联的一个学生。一对多示例(或多对一,取决于关系方向):一个学生注册多个课程,但所有这些课程都有一行返回该学生。多对多示例:学生作为一个小组与多个教职员工相关联,而教职员工又与多个学生相关联。

基数视图:基数可以显示为横向或同侧,具体取决于符号的显示位置。

基数约束:适用于关系的最小或最大数量。

映射自然语言

ER成分可以等同于词性,就像Peter Chen所做的那样。这显示了 ER 图与语法图的比较:

  • 普通名词:实体类型。示例:学生。

  • 专有名词:实体。示例:莎莉·史密斯。

  • 动词:关系类型。示例:注册。(例如,在课程中,这将是另一种实体类型。

  • 形容词:实体的属性。示例:大二。

  • 副词:关系的属性。示例:数字方式。

数据库查询语言 ERROL 实际上模仿自然语言构造。ERROL基于重塑的关系代数(RRA),并与ER模型一起工作,捕获其语言方面。

ERD 符号

有几种符号系统,它们相似,但在一些细节上有所不同。

陈记谱风格

鱼尾纹/马丁/信息工程风格

巴赫曼风格

IDEF1X 样式

巴克风格

例子

以下是在每个系统中制作的 ERD 图的示例。

概念、逻辑和物理数据模型

ER 模型和数据模型通常最多绘制三个详细级别:

  • 概念数据模型:包含最少详细信息的最高级别视图。它的值是显示模型的整体范围并描绘系统体系结构。对于范围较小的系统,可能没有必要绘制。相反,请从逻辑模型开始。

  • 逻辑数据模型:包含比概念模型更多的细节。现在定义了更详细的运营和交易实体。逻辑模型与实现它的技术无关。

  • 物理数据模型:可以从每个逻辑模型开发一个或多个物理模型。物理模型必须显示足够的技术细节才能生成和实现实际数据库。

请注意,其他类型的图表(如数据流图)中也存在类似的详细信息和范围级别,但它与软件工程的三架构方法形成鲜明对比,后者对信息的划分略有不同。有时,工程师会使用其他层次结构分支ER图,为数据库设计添加必要的信息级别。例如,他们可以通过向上扩展超类和向下扩展子类来添加分组。

ER 图和模型的局限性

  • 仅适用于关系数据:明白目的是展示关系。ER 图仅显示该关系结构。

  • 不适用于非结构化数据:除非将数据清晰地划定为不同的字段、行或列,否则 ER 图的用途可能有限。半结构化数据也是如此,因为只有部分数据是有用的。

  • 难以与现有数据库集成:由于体系结构不同,使用 ER 模型与现有数据库集成可能是一个挑战。

如何绘制基本的 ER 图

  1. 目的和范围:定义要分析或建模的内容的目的和范围。

  2. 实体:确定涉及的实体。准备就绪后,开始将它们绘制成矩形(或系统选择的形状)并将它们标记为名词。

  3. 关系:确定实体如何关联。在它们之间画线以表示关系并标记它们。有些实体可能不相关,这很好。在不同的符号系统中,关系可以用菱形、另一个矩形或直接在连接线的顶部标记。

  4. 属性:通过添加实体的关键属性来更详细地分层。属性通常显示为椭圆形。

  5. 基数:显示关系是 1-1、1 多还是多对多。

有关 ER 图的更多提示

  1. 显示您的目的所需的详细程度。您可能需要绘制概念、逻辑或物理模型,具体取决于所需的细节。(有关这些级别的说明,请参阅上文。

  2. 注意冗余实体或关系。

  3. 如果要解决数据库问题,请注意关系中的漏洞或缺少的实体或属性。

  4. 确保标记了所有实体和关系。

  5. 您可以来回转换关系表和 ER 图,如果这有助于您实现目标。

  6. 确保 ER 图支持您需要存储的所有数据。

  7. ER 图可能有不同的有效方法。只要它为其范围和目的提供必要的信息,它就很好。

有关实体关系 (ER) 图的几种不同风格的符号的更多相关文章

  1. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  2. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  3. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  4. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  5. java - 为什么 ruby​​ modulo 与 java/other lang 不同? - 2

    我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.

  6. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  7. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  8. ruby - 如果它是标点符号,我怎么能从字符串中删除最后一个字符,在 ruby​​ 中? - 2

    啊,正则表达式有点困惑。我正在尝试删除字符串末尾所有可能的标点符号:ifstr[str.length-1]=='?'||str[str.length-1]=='.'||str[str.length-1]=='!'orstr[str.length-1]==','||str[str.length-1]==';'str.chomp!end我相信有更好的方法来做到这一点。有什么指点吗? 最佳答案 str.sub!(/[?.!,;]?$/,'')[?.!,;]-字符类。匹配这5个字符中的任何一个(注意,。在字符类中并不特殊)?-前一个字符或组

  9. ruby - 如何在 Ruby 字符串中插入项目符号字符? - 2

    我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195

  10. c - Ruby - 源代码 - 编码风格 - 2

    查看Ruby代码,它具有以下proc_arity:staticVALUEproc_arity(VALUEself){intarity=rb_proc_arity(self);returnINT2FIX(arity);}更多的是C编码风格问题,但为什么staticVALUE在单独的一行而不是像这样的:staticVALUEproc_arity(VALUEself) 最佳答案 它来自UNIX世界,因为它有助于轻松grep函数的定义:$grep-n'^proc_arity'*.c或使用vim:/^proc_arity

随机推荐