2016-01-22 57 views
0

假设您有一位拥有一家餐厅的厨师,反之亦然。因此,通过one-to-one关系,您可以将厨师表中的主键idcook_id作为餐馆表中的主键和外键。数据库关系 - 也有一对多的一对一

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


编辑:我想过一个更好,更现实的例子。假设您的工单只有一个报价。您将在quotes表中获得工作订单的id,因为它是1比1。作为一个报价,它必然会发生变化,同样的特殊报价也会被修改。如果您想记录对报价(或某种历史记录)进行的修改,则需要类似quote_revisions表。在这种情况下,工单只能有一个报价,而报价可以有很多报价修订。你用什么ID链接quotesquotes_revisions表?

+0

1:1很少见。每个餐厅你有一个厨师,他们永远不会改变? –

+0

这是正确的。我的问题更多的是我想知道的一般设计问题,所以我在编辑过的文章中提供了一个更好的例子。 – kenshin9

回答

1

使用Work_order例如:

  • Work_order会有的,比方说,一个wo_id PK,这可能是AUTO_INCREMENT
  • 行情将具有相同的wo_id PK,但不是AUTO_INCREMENT
  • Quote_revisions将有一个INDEX(wo_id),但一些其他列的PK。

工作订单和报价是“1:1”,由wo_id提供。

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

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

+0

这听起来也符合我的想法。谢谢你的帮助。 – kenshin9

0

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

2

由于您有一对一的关系,所以厨师的ID也是餐厅的ID。您可以通过将客户密钥与餐桌上的厨师/餐厅钥匙(顾客或其他餐桌)相关联,将顾客与餐馆联系起来。一对多基数是通过对客户的关键字设置一个唯一的约束来强制执行的,以便他们不能与多个餐厅/厨师关联。