数据库关系 - 一对一也有一对多
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 链接 quotes
和 quotes_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。如果您愿意,可以对外键设置唯一约束,以确保关系确实保持一对一。或者,您可以简单地拥有一张餐厅餐桌,其中包含有关其主厨信息的字段。
【讨论】:
以上是关于数据库关系 - 一对一也有一对多的主要内容,如果未能解决你的问题,请参考以下文章