数据库关系 - 一对一也有一对多
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 quotes
和 quotes_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比较大而且静态,另一个比较小而且经常变化。)
假设您的一位厨师拥有一家餐厅,反之亦然。因此,对于 one-to-one
关系,您将拥有厨师 table 中的主键 id
和餐厅 table 中的主键和外键 cook_id
。
那么,您如何表示餐厅与其顾客之间的 one-to-many
关系?由于餐厅没有自己的 ID,顾客 table 是否有自己的 id
然后包含 cook_id
的外键?
编辑:我想到了一个更好更现实的例子。假设您有一份只有一个报价单的工作订单。您将在 quotes
table 中获得工单的 id
,因为它是一对一的。作为引用,它必然会发生变化,并且相同的特定引用会被修改。如果你想记录对引用所做的修改(或某种历史日志),你需要像 quote_revisions
table 这样的东西。在这种情况下,一个工单只有一个报价,一个报价可以有多个报价修订。 link quotes
和 quotes_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比较大而且静态,另一个比较小而且经常变化。)