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

Database Relationships - One-to-One that also has One-to-Many

假设您的一位厨师拥有一家餐厅,反之亦然。因此,对于 one-to-one 关系,您将拥有厨师 table 中的主键 id 和餐厅 table 中的主键和外键 cook_id

那么,您如何表示餐厅与其顾客之间的 one-to-many 关系?由于餐厅没有自己的 ID,顾客 table 是否有自己的 id 然后包含 cook_id 的外键?


编辑:我想到了一个更好更现实的例子。假设您有一份只有一个报价单的工作订单。您将在 quotes table 中获得工单的 id,因为它是一对一的。作为引用,它必然会发生变化,并且相同的特定引用会被修改。如果你想记录对引用所做的修改(或某种历史日志),你需要像 quote_revisions table 这样的东西。在这种情况下,一个工单只有一个报价,一个报价可以有多个报价修订。 link quotesquotes_revisions table 使用什么 ID?

我会用 restaurant_id 字段作为餐厅 table 的主键,同时 cook_id 作为外键。是的,这种结构将支持 one-to-many 关系以及 one-to-one 关系,但我相信每个实体都应该有自己的 ID。如果愿意,可以在外键上设置唯一约束,以确保关系保持 one-to-one。或者您可以简单地拥有一家餐厅 table,其中包含有关其主厨信息的字段。

因为你们有 one-to-one 关系,厨师的 id 也是餐厅的 id。您可以通过将客户密钥与 table(客户或另一个 table)中的 cook/restaurant 密钥相关联来将客户与餐馆相关联。 one-to-many 基数是通过对客户的键设置唯一约束来强制执行的,这样他们就不能与多个 restaurant/cook.

相关联

使用 Work_order 示例:

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

Work_order 引号为“1:1”,由 wo_id.

提供

引号和Quote_revisions是“1:N”; wo_id 在两个 table 中都提供了这种关系。

1:1 很少有用,但您的示例可能是一个很好的用例。 (一个table比较大而且静态,另一个比较小而且经常变化。)