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

时间:2016-01-22 07:20:05

标签: mysql database database-design relational-database

假设您有一位有一家餐馆的厨师,反之亦然。因此,如果使用one-to-one关系,您将在cooks表中使用主键id,并将cook_id作为restaurants表中的主键和外键。

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

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

3 个答案:

答案 0 :(得分:2)

由于你有一对一的关系,厨师的身份证也是餐馆的身份证。您可以通过将客户键与表(客户或其他表)中的厨师/餐厅键相关联来将客户与餐馆联系起来。通过在客户的密钥上放置一个唯一约束来强制执行一对多基数,这样他们就无法与多个餐厅/厨师相关联。

答案 1 :(得分:1)

使用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提供。

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

拥有1:1很少有用,但您的示例可能是一个很好的用例。 (一张桌子相对较大而且是静态的,另一张桌子相对较小且经常更换。)

答案 2 :(得分:0)

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