数据库关系 - 一对一也有一对多

Posted

技术标签:

【中文标题】数据库关系 - 一对一也有一对多【英文标题】:Database Relationships - One-to-One that also has One-to-Many 【发布时间】:2016-01-22 07:20:05 【问题描述】:

假设您的一位厨师拥有一间餐厅,反之亦然。因此,对于 one-to-one 关系,您将在 cooks 表中拥有主键 id,并在餐厅表中拥有 cook_id 作为主键和外键。

那么您将如何表示餐厅与其顾客之间的one-to-many 关系?既然餐厅没有自己的ID,那么customers表会不会有自己的id,然后包含cook_id的外键?


编辑:我想到了一个更好、更现实的例子。假设您有一个只有一个报价的工单。您将在quotes 表中拥有工作订单的id,因为它是一对一的。作为报价,它必然会改变,并且相同的特定报价会被修改。如果您想记录对报价(或某种历史日志)所做的修订,您需要类似quote_revisions 表的内容。在这种情况下,一个工作订单只有一个报价,一个报价可以有多个报价修订。您使用什么 ID 链接 quotesquotes_revisions 表?

【问题讨论】:

1:1 很少见。每家餐厅是否只有一名厨师,而且他们从未更换? 没错。我的问题更像是一个我想知道的一般设计问题,所以我在我编辑的帖子中提供了一个更好的例子。 【参考方案1】:

由于您是一对一的关系,因此厨师的 ID 也是餐厅的 ID。您可以通过将客户键与表(客户或其他表)中的厨师/餐厅键相关联来将客户与餐厅相关联。一对多的基数是通过对客户的键设置唯一约束来实施的,这样他们就不能与一个以上的餐厅/厨师相关联。

【讨论】:

【参考方案2】:

使用 Work_order 示例:

Work_order 的 PK 可能是 wo_id,也可能是 AUTO_INCREMENT。 引用的 PK 具有相同的 wo_id,但不是 AUTO_INCREMENT。 Quote_revisions 将有一个INDEX(wo_id),但还有一些其他列用于 PK。

Work_order 和 Quotes 是“1:1”,由 wo_id 提供。

Quotes 和 Quote_revisions 为“1:N”;两个表中的wo_id 提供了这种关系。

1:1 很少有用,但您的示例可能是一个很好的用例。 (一张表比较大,是静态的,一张比较小,经常更换。)

【讨论】:

这听起来也符合我的想法。感谢您的帮助。【参考方案3】:

我会改为将 restaurant_id 字段作为餐厅表中的主键,并将 cook_id 作为外键。是的,这种结构将支持一对多关系和一对一关系,但我相信每个实体都应该有自己的 ID。如果您愿意,可以对外键设置唯一约束,以确保关系确实保持一对一。或者,您可以简单地拥有一张餐厅餐桌,其中包含有关其主厨信息的字段。

【讨论】:

以上是关于数据库关系 - 一对一也有一对多的主要内容,如果未能解决你的问题,请参考以下文章

获取对象时无法访问一对多CoreData关系

在 Json.net 中序列化一对多关系

在 Eloquent 中嵌套一对多关系

MyBatis之基于XML的表之间映射

Mybatis框架中实现一对多关系映射

数据库一对一对多多对多关系