【问题标题】:One to many partial association一对多部分关联
【发布时间】:2020-10-26 10:14:18
【问题描述】:

我在 ParkingsCars 之间有一个名为 Includes 的关联。

这是一个双方都偏的一对多关联,因为一个停车场可以包含零个或多个汽车,而一个汽车可以包含零个或一个停车场。

我会在 Cars 表中添加与停车场相关的 FOREIGN KEY,但汽车并非总是在停车场内。

如何处理这种情况?

【问题讨论】:

  • 当汽车不属于停车场时,请离开 FK NULL
  • 那个停车太马虎,占了两个车位的人怎么办?
  • 这是一个常见问题解答:有大量关于如何处理“缺失信息”的文本。我说“缺失”是因为这是常用术语,但它具有误导性:空的lot 并不意味着缺少任何carcar 当前不在 lot 中并不意味着汽车在任何特定的 lot 中丢失。所以在这种情况下,我宁愿说“不适用”或“不给定”;在其他示例中,您可能会说“未知”。
  • AntC 和我对模型的理解似乎有所不同。这是关于汽车和停车场的吗?给出一个简短的数据集,至少举例说明 1:many, missing, zero, zero on the other side等有效情况。
  • 我将拒绝@RickJames 对他的回答发表评论的邀请:对于一个非常常见的“问题”,StackOverflow 不需要更多答案。没问题:一套完全日常的数据库设计要求。搜索“缺失信息”和/或“避免 NULLS”。这里有一些初学者,其中包括更多链接stackoverflow.com/questions/21208459/…stackoverflow.com/questions/3079885/…

标签: mysql database database-design relational-database


【解决方案1】:

因此,汽车有一个栏目说明它当前停在哪里。或者NULL在路上漫游?

停车场(停车场)可以有很多车吗?但它不需要列来表明这一点。该信息可以通过JOIN 与另一个表获得。

FOREIGN KEY 是两件事:

  • 完整性检查。您不希望将car 停在不存在的lot 中。
  • INDEX 使上述JOIN 更高效。

如果没有看到SELECTs(和其他查询),我们就无法判断所需的索引。

要在一个批次中找到所有汽车:

SELECT *
    FROM cars
    WHERE lot = 123 

这需要cars 中的INDEX(lot)(或FK)。

要查找一辆车在哪里:

SELECT lot FROM cars WHERE id = 456;

推测carsPRIMARY KEY(id)

【讨论】:

  • 需要进行两次完整性检查:在不存在的lot 中没有car,就像你一样;在任何lot 中不超过一个car,这需要UNIQUEcars.lot 列的约束。 SELECT * FROM cars WHERE lot = 123应该最多返回一行:是业务情况结构造成的,与索引效率无关。
  • 一般来说,可以为空的 FOREIGN KEY 是有问题的(从 Null 到 REFERENCEd 表的任何 JOIN 都会失败);可空列上的 UNIQUE 约束是有问题的(如果有两个 Null,它们算作唯一吗?)。所以我不会在car 上添加一个额外的(可为空的)列;我会制作一个单独的链接表。
  • @AntC - 在答案中拼出所有内容,以及更多内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2015-01-26
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多