为什么 ERD 中不允许使用特定基数?

2024-03-29

在有关实体关系图的每个教程中,我都读到不允许为关系指定固定基数。只有对 ERD 的非正式评论才能澄清飞行员的数量exactly 2.

因此,例如,航班和飞行员之间的关系,其中每个航班恰好有 2 名飞行员,必须表示为:

<flight> 0..N <------> 1..N <pilot>

而不是

<flight> 0..N <------> 2 <pilot>

我的记号是0..N= 可选,很多;1..N= 强制,很多,1= 强制,一。

这个限制是普遍的吗?其背后的原因是什么?

编辑:澄清我的符号。

编辑:我可以看到两个关系如何强制执行相同的约束:

         0..N <------> 1
<flight>                 <pilot>
         0..N <------> 1

但是,查看飞行员是否在给定航班上的查询变得非常难看,因为您必须检查两个属性中的每一个。如果属性数量增加(例如,增加到 15 名空乘人员),查询将变得完全难以管理,而架构也几乎无法管理。


其他回复提供了一些有价值的答案。还需要添加两块:

首先,ER 建模不仅仅是 ERD。我们倾向于尝试将整个 ER 模型放在一张图表上。但完整的 ER 建模远远超出了单个图表所能容纳的范围。可能存在将关系的基数限制为不小于 10 且不大于 15 的业务规则。但重要的是要认识到这些必须是“业务规则”(即主题规则),而不是出于实际原因强加的设计限制。完整的 ER 模型可以包含数据上的所有这些业务规则,并且如果需要,可以用简单的英语来表达这些规则。

符号 10..15 是首选,因为它更简洁,除非需要更多细节来阐明规则,例如规则存在的原因。

上面暗示了需要提出的第二点。这就是分析和设计的区别。如果以经典方式使用 ER 建模,那么它是数据分析工具,而不是数据库设计工具。我所说的“数据分析”是指从以数据为中心的角度来分析问题。正规的 CS 或 IT 教育中没有充分教授区分分析和设计、问题特征和解决方案特征。这对于把事情做好绝对至关重要。

即使我们这些意识到差异的人有时也会犯错,将解决方案的特征滑入问题的定义中。这被称为“框内思考”。

如果您想用图表表示数据库设计,请不要使用 ERD。使用关系示意图,前提是您正在设计的数据库是关系型的。关系示意图包含 ERD 不应包含的功能,例如连接表和外键。不要将 ERD 用作“关系精简版”。事实并非如此。

顺便说一句,另一个答案评论说 ERD 应该可以在任何 DBMS 上实现。这是我刚才提出的概念的结果,即 ERD 捕获的是分析而不是设计。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 ERD 中不允许使用特定基数? 的相关文章

  • 使用 CouchDB 视图替换 SQL 中的多个联接

    我正在为我的应用程序实现过滤功能 但在 CouchDB 上编写视图时遇到问题 在 SQL 中 这将是一个具有多个连接的语句 如何替换 CouchDB 中的多重连接 本文涵盖单连接 http www cmlenz net archives 2
  • 带有 varchar(255) PRIMARY KEY 的表会造成什么损害吗?

    我知道这不是一个好主意 但我想仔细检查一下这不会造成服务器崩溃等疯狂的事情 CREATE TABLE dbo Items Id nvarchar 255 NOT NULL PRIMARY KEY Value nvarchar max NOT
  • Ruby 模型的数组属性

    是否可以为数组类创建一个属性 我尝试阅读this https stackoverflow com questions 3438827 ruby model with an array as an attribute但我并没有从中得到太多 我
  • 如何为每个用户构建未读项目警报的数据库

    我只是有一个一般的数据库理论问题 我需要制作类似于显示用户已查看或未查看的帖子 项目 例如在论坛中 或未读电子邮件的内容 我所拥有的是多个用户可以查看的帖子 但需要按实际查看过的用户分开 因此 如果用户 A 浏览了帖子 1 则不会再显示帖子
  • 了解 MySQL Workbench EER 图中的箭头提示

    我根据这个问题使用逆向工程函数生成 Yelp 数据集的 EER 图here https stackoverflow com questions 2488 auto generate database diagram mysql 它看起来像这
  • HBase:创建多个表或包含多个列的单个表?

    什么时候创建多个表而不是创建具有大量列的单个表才有意义 据我了解 表通常只有几个列族 1 2 每个列族可以支持 1000 多个列 当 HBase 似乎在单个表中可能存在大量列时表现良好时 什么时候创建单独的表才有意义 在回答问题本身之前 让
  • Postgres 动态创建序列

    我正在编写一个应用程序 其中有多个用户 用户可以在应用程序内上传报告 目前 我有一个 报告 表 其中包含所有提交的报告 其中有一个 id 字段 该字段是表上的序列主键 我指定的要求是 用户需要能够指定其报告开始计数的前缀和数字 例如 用户应
  • 在数据库中对用户定义的层次关系进行建模的最佳方法是什么?

    本质上 我希望用户能够定义分层模型 但随后我需要允许用户在其定义的模型中存储数据 这有道理吗 因此 用户将能够创建新的 单元类型 以分层方式进行组织 并决 定如何组织这些类型的单元 一个简单的例子 在我假设的界面中 用户创建了三种单位类型
  • 对于依赖于时间的大型数据集,命名表 september_2010 是否可接受且有效?

    我每天需要存储大约 73 200 条记录 由 3 个数据点组成 id 日期和整数 我团队的一些成员建议使用月份作为表名称 september 2010 创建表 而其他人则建议使用一个包含大量数据的表 关于如何处理如此大量的数据有什么建议吗
  • 从 CREATE TABLE SQL 生成图形模式表示

    我有一个包含许多 CREATE TABLE 语句的 sql 文件 没有参考规范 MyISAM 的东西 但我喜欢创建不同的表框 然后手动组成表关系 我正在使用Mac 有免费的程序可以做到这一点吗 是的MySQL工作台 http dev mys
  • 管理数据库更改的最佳方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 管理数据库更改的最佳方法是什么 无论数据库客户端的语言如何 我都需要有一个解决方案 另外 我希望能够在这些更改中使用特定的数据库功能
  • MySQL - 超类型/子类型设计

    我需要创建以下数据库 对于半卡车 我不需要额外的子类型 而对于汽车 我只需要这 3 个子类型 对于轿车 我需要四个子类型 对于 SELECT 我将使用 JOIN 规范化数据库 但我需要找到一种简单的方法来进行 INSERT 车辆表存储常用信
  • 优雅的模式来记录用户的操作

    我有一个数据库架构来记录用户在我的网络应用程序中执行的操作 Log Id Log Type Id Performed by Person Id Performed to Person Id Comment Id Story Id Photo
  • 标签系统:Toxi 解决方案问题

    我对标签数据库模式的 Toxi 解决方案感到有点困惑 我正在开发一个系统 用户可以向该系统提交项目 并且这些项目可以具有与其关联的标签 在阅读了 tagchemas 后 我发现 Toxi 解决方案最适合我的需求 但是 我不完全确定我的计划是
  • 数据库中的 GUID 类型

    GUID不是数据库中的正式数据类型 在我们现有的 SQL Server 设计中 Uniqueidentifier类型用于GUID价值 现在我们正在切换到Sybase数据库 我们应该使用varchar 36 来代替那个Uniqueidenti
  • 我应该设计一个 SQL Server 数据库来依赖 UNION 还是避免它?

    执行以下 SQL 查询 SELECT Account Amount AS Deposit 0 00 AS Withdrawal Date FROM Deposits WHERE Account Account UNION SELECT Ac
  • 事件源和 SQL Server 多个关系表

    我们使用 SQL Server 2016 的事件源 我们有完整的客户产品应用程序 每个应用程序都标记为CustomerId并在事件商店中获取单个指南行项目 这是写入事件存储指南的主要标识符 产品应用程序附带许多不同的关系事物 没有引导 但有
  • 如何设计多租户mysql数据库[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设我需要设计一个数据库来托管多个公司的数据 现在 出于安全和管理目的 我需要确保不同公司的数据正确隔离 但我也不想启动 10 个 m
  • 创建用于存储高尔夫球成绩的可扩展数据库架构

    我正在尝试设计一个数据库来存储我所有的朋友和我的高尔夫球成绩 您可能知道 高尔夫得分由 18 洞的个人得分组成 我可以想到两种设计模式的方法 创建一个表 每个洞有一列 例如 h1 到 h18 该表具有引用其他表的 FK player id
  • 如何使用 django 更新会计应用程序中的余额?

    我正在学习 Django 尝试制作一个会计应用程序来跟踪我的开支等 我使用两种模型创建数据库 一种用于帐户 一种用于操作 但我不知道如何在每次操作时更新我的 余额 我在想 也许每次我保存一个新操作时 我都会通过覆盖操作模型的保存方法来更新余

随机推荐