Database design 为什么ERD中不允许特定的基数?

Database design 为什么ERD中不允许特定的基数?,database-design,entity-relationship,database-schema,erd,Database Design,Entity Relationship,Database Schema,Erd,在每个关于实体关系图的教程中,我都读到不允许为关系指定固定基数。只有对ERD的非正式评论可以澄清飞行员的数量正好是2 因此,例如,航班和飞行员之间的关系,其中每个航班正好有2名飞行员,必须表示为: <flight> 0..N <------> 1..N <pilot> 但是,如果要查询飞行员是否在给定的航班上,就会变得非常难看,因为您必须检查两个属性中的每一个。如果属性的数量增加(比如说,增加到15名乘务员),查询将变得完全无法管理,模式也几乎无法管理。您有

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

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

<flight> 0..N <------> 1..N <pilot>
但是,如果要查询飞行员是否在给定的航班上,就会变得非常难看,因为您必须检查两个属性中的每一个。如果属性的数量增加(比如说,增加到15名乘务员),查询将变得完全无法管理,模式也几乎无法管理。

您有唯一索引(如主键)和非唯一索引: 根据您的唯一密钥定义,允许有1条记录或多条记录

然后

您有空字段或强制具有值的字段: 这里可以有0或1个值

结合这两件事,你应该能够知道,为什么他们总是说0或更多

ERD不能总是强制执行规则,规则通常可以由DB设计强制执行,但它总是需要来自软件的另一层(或至少是存储过程)


顺便说一句,关于你的例子,如果你每次飞行都有2个飞行员,并且你想通过db设计来实施这个规则,你可以简单地从飞行员表到飞行表创建2个关系,是的,你将有2个外键到同一个表,ERD允许

E-R
图表提供一种方法,以指示每个实体参与关系的次数限制。
实体集和二进制关系集之间的边可以具有关联的最小和最大基数:
min…max

min
1
表示全部参与。
max
1
表示最多参与一次,
max
*
N
表示没有上限。
现在来回答你的问题。您的建模一开始就错了,因为飞行员可能会在多个航班上飞行,而不是像您所暗示的那样 此外,如果每个航班正好有2名飞行员,并且两名飞行员都是必需的,那么这不是建模为
1-N
关系,而是建模为一个航班的2个属性(飞行员id),因为它们永远不会为空或可选(不能有没有2名飞行员的航班)。

因此,常数的上限表明设计中存在一些问题,这些问题不够通用,无法对系统建模。

基数规则本身只是“一般情况下任何和所有可能规则”的特例。唯一能够表达“任何和所有可能规则”的两种语言是人类自然语言(无论你怎么努力,它的缺点是常常模棱两可和不精确),以及形式谓词逻辑的符号语言

如何在数据建模的环境中使用后者,这是《数据库专业人员应用数学》这本极好(且备受赞誉)的书的全部主题

Halpin的ORM试图提出一种建模语言,该语言可以覆盖(即,有图形符号来表示)比e/R更多种类的业务规则。例如,它有表示非循环图约束的符号(“没有人是自己的祖先”)。但即使是这种语言也无法表达一切,必须借助于它称之为“其他”的最后一类约束,而这些约束只能用自然语言来描述


这是一个语言问题。如果你设计了一种符号数量非常少的语言(矩形、连接线、零、一和乌鸦脚),这种符号只能以非常少的方式组合,那么你就不能指望这样的语言能够表达任何可以想象的东西。

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

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

最好使用符号10..15,因为它更简洁,除非需要更多细节来澄清规则,例如规则存在的原因

以上暗示了第二点需要注意。这是分析和设计之间的区别。如果ER建模以经典方式使用,那么它是数据分析的工具,而不是数据库设计的工具。所谓“数据分析”,我指的是从以数据为中心的角度进行问题分析。区分分析和设计,区分问题的特征和解决方案的特征,在正式的CS或IT教育中是不够的。这对把事情做好绝对至关重要

即使是我们这些意识到差异的人,有时也会犯错误,将解决方案的特征滑入问题的定义中。这就是所谓的“盒子里思考”

如果您想绘制数据库设计图,不要使用ERD。使用关系示意图,前提是所设计的数据库是关系数据库。关系示意图包含ERD不应包含的功能,如连接表和外键。不要将ERD用作“关系lite”。事实并非如此

顺便说一句,另一个答案是ERD应该可以在任何DBMS上实现。这是我刚才提出的概念的结果,即
<flight> 0..N <------> 2 <pilot>
         0..N <------> 1
<flight>                 <pilot>
         0..N <------> 1
CHECK (POSITION BETWEEN 1 AND 15)
SELECT DISTINCT *
FROM (
    SELECT POSITION + 1 FREE_POSITION
    FROM FLIGHT_ATTENDANT
    WHERE FLIGHT_ID = 1
    UNION ALL
    SELECT POSITION - 1 FREE_POSITION
    FROM FLIGHT_ATTENDANT
    WHERE FLIGHT_ID = 1
)
WHERE
    FREE_POSITION NOT IN (
        SELECT POSITION
        FROM FLIGHT_ATTENDANT
        WHERE FLIGHT_ID = 1
    )
ORDER BY FREE_POSITION;