【问题标题】:How does cardinality work in an ER diagram when considering the dimension of time?在考虑时间维度时,基数如何在 ER 图中起作用?
【发布时间】:2019-02-25 04:34:34
【问题描述】:

我将使用有两个实体的问题片段来解释我的问题:

????飞机

????位置

以及链接这些实体的关系:

????发送

逻辑 1:

一架飞机发送最少 1 个位置,最多发送多个位置(在不同时刻),因此,基数是一对多 (1,N) .

Airplane ——— (1,N) ——— Send ——— (1,N) ——— Location 


逻辑 2:

一架飞机发送最少 1 个位置,但它不能同时发送多个位置,因此,最小值为 1,最大值为 1,所以基数是一对一 (1,1)。

Airplane ——— (1,N) ——— Send ——— (1,1) ——— Location


不仅在 ER 中,而且在数据库中。这些逻辑哪个是正确的?

【问题讨论】:

  • 您的问题因时间问题而变得非常复杂。所以我编辑了标题来说明这一点。
  • @BasilBourque 哦,谢谢!

标签: database entity-relationship cardinality


【解决方案1】:

多对多

您的业务问题可能不清楚,所以让我们看一下书籍和作者的规范示例。一本书可以有多个作者,每个作者都可能为多本书做出贡献。所以我们有一个经典的多对多。

关系数据库不直接处理多对多关系。为此,我们添加了第三个表来桥接原来的两个表。命名这第三张表可能有点令人费解,因为它通常代表一种不那么具体的业务关系。在这种情况下authorship 是合适的。

书籍和作者

[书]-1-----0-1-M-[作者]-M-1-0-----1-[作者]

表格:

  • book
    • pkey(主键,每本书的唯一标识)
    • title
    • planned_publish_date
  • authorship
    • pkey(可选,因为有些人使用组合键中的其他两列作为此表的主键)
    • fkey_book(保存作者贡献的图书的主键值)
    • fkey_author(保存为本书做出贡献的作者的主键值)
  • author
    • pkey(主键,每个作者的唯一标识)
    • name
    • phone_number

这里的基数是:

  • 一本书可以有任意数量的 authorship 相关行:基数为 0、1、M(M 表示不止一个)。
    • 计划中的书在authorship 中可以有零行,因为它尚未与任何作者关联。稍后,当招募作者时,我们会在作者身份中添加一行。
    • 单作者的书有一个authorship 行,链接到一个作者。
    • 一本有一对作者的书将有两个authorship 行,每行都有一个链接到author 行的外键。
  • author-authorship 关系同上:基数为 0、1、M。
    • 已被招募但尚未致力于任何书籍的作者将在author 表中有一行,但在authorship 中没有行。
    • 只写过一本书的作者将在authorship 中有一行。
    • 一位多产的作者将在authorship 中有很多行,他/她贡献的每一本书都有一行。
  • authorship 行必须分配给一本书并分配给作者:基数为 1 与 book,1 与 author
    • 我们不允许任何authorship 行被“孤立”,以使用像我这样的人在描述表关系时使用的父子语言。换句话说,在每一行 authorship 上,pkey_book 字段必须有一个有效值,pkey_author 字段必须有一个有效值。

时间

添加时间维度是一个棘手的问题。

举个例子……要跟踪每个作者的图书合同开始和结束的时间段,我们将在authorship 表中添加一对DATE 列,标题为contract_startcontract_stop

  • authorship
    • pkey(此表的主键)
    • fkey_book(保存作者贡献的图书的主键值)
    • fkey_author(保存为本书做出贡献的作者的主键值)
    • contract_startDATE 类型)
    • contract_stop

当前有效的合同的查询会将今天的日期与contract_start 和小于contract_stop 进行比较。然后通过join 获取书名和作者姓名。

另一个例子……如果我们的出版公司有一个商业政策,作者必须一次只专注于一本书,并且希望数据库强制执行作者的合同不能重叠……那么,这是另一个问题。出于几个原因,我不会解决它,其中之一是我不知道您的问题是否有这个问题。

飞机-飞行-位置

至于你的飞机问题,我猜Send 你的意思是飞行。如果是这样,为了清楚起见,我会将该表命名为 flight。按位置,我想你的意思是机场。同样,为了清楚起见,我将表命名为 airport

如果这是您的意思,那么您的基数与上面讨论的完全相同。

  • 加入机队的飞机可能从未飞过、飞过一次或飞过许多地方。所以,0-1-M。
  • 我们的系统可能在我们在那里飞行任何飞机之前就知道机场,因此零飞行排。稍后,当我们安排一架或多架飞机前往该机场时,会安排一排或多排航班。所以,0-1-M。

flight 表包含出发日期时间列和持续时间列。

  • flight
    • pkey(此表的主键)
    • fkey_plane(保存该日期时间要飞往该机场的飞机的主键值)
    • fkey_airport(保存这架飞机在该日期时间起飞的机场的主键值。)
    • departure(本次航班起飞时,类型为TIMESTAMP WITH TIME ZONE
    • duration(本次飞行的长度,分钟数)。

[飞机]-1-----0-1-M-[航班]-M-1-0-----1-[机场]

您的业务规则可能会有所不同。如果您计划飞行但尚未指定飞机,那么我们可以有一个flight 行而没有指定飞机。所以1 的基数变为0 or 1。但不是M,因为一个特定的航班从不涉及多架飞机。在此业务规则的情况下,flight 行可能是孤立的,直到最终分配特定平面时才缺少plane 父行。

[飞机]-1-0-----0-1-M-[航班]-M-1-0-----1-[机场]

【讨论】:

  • 你的回答很清楚明白,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多