在MySQL中实现一对一关系时确定外键

Jay*_*att 18 mysql database database-design entity-relationship one-to-one

我有两个简单的表"items"和"orders".为简单起见,我们假设一个项目只能在一个订单中,或者一个订单只能包含一个项目.

现在,因为这可以使用简单的一对一关系实现,我可以执行以下操作:

我可以将orders表的主键添加到items表中,如下所示

//Table Items
item_id, item_name, order_id
1,        shoes,    1
2,        watch,    2

//Table Orders
order_id, customer
1,        James
2,        Rick
Run Code Online (Sandbox Code Playgroud)

或者我可以将items表的主键添加到orders表中,如下所示

//Table Items
    item_id, item_name
    1,        shoes
    2,        watch

//Table Orders
order_id, customer, item_id
1,        James,    1   
2,        Rick,     2
Run Code Online (Sandbox Code Playgroud)

哪一个是正确的,为什么?是否有任何指导线来决定哪个键在哪里?当然,常识会在上面的简单例子中起作用,但在复杂的例子中我们如何决定?

Grz*_*rek 20

一对一关系通常应简单地合并到一个表中.如果没有任何矛盾,一对一关系可能是未经考虑的决定的标志.

如果你真的想要使用这种关系,那完全取决于你在哪里放置FK.在应用FK时,您可能需要考虑可选性.但是,在MySQL中,它仍然不是真正的一对一关系,因为那里不支持延迟密钥.

  • 与本问题中给出的示例不同,一些一对一关系属于IS-A种类.IS-A关系通常是对象建模中称为类/子类的模式的示例,并且在ER建模中称为泛化/特化.在这种情况下,将表拆分为[Tag:class-table-inheritance]通常很有用. (7认同)
  • 我们遇到了类似的问题我们的问题是交易和位置具有一对一的关系。位置包含交易发生地点的信息。经过进一步分析,我们得出结论:Location与Transaction相关,并不是独立存在的。在某种程度上,这就像一个子实体。因此,我们在位置表中使用了事务的外键。 (2认同)