一对多和多对一关系的真正区别是什么?
这些术语之间存在概念上的差异,应该可以帮助您可视化数据,并且应该完全理解生成的架构中可能存在的差异。不过,主要区别在于视角之一。
在一对多关系中,本地表的一行可能与另一个表中的许多行相关联。在SQL for beginners 的示例中,一个Customer 可能与多个Orders 相关联。
在相反的多对一关系中,本地表可能有许多行与另一个表中的一行相关联。在我们的示例中,许多Orders 可能与一个Customer 相关联。这种概念上的差异对于心理表征很重要。
此外,支持关系的模式在Customer 和Order 表中的表示方式可能不同。例如,如果客户有id 和name 列:
id,name
1,Bill Smith
2,Jim Kenshaw
然后,为了将Order 与Customer 关联起来,许多SQL 实现会在Order 表中添加一个列,该列存储关联Customer 的id(在此架构customer_id 中:
id,date,amount,customer_id
10,20160620,12.34,1
11,20160620,7.58,1
12,20160621,158.01,2
在上面的数据行中,如果我们查看customer_id id 列,我们会看到Bill Smith (customer-id #1) 有两个与他关联的订单:一个是 12.34 美元,一个是 7.58 美元。 Jim Kenshaw(客户 ID #2)只有 1 个订单,价格为 158.01 美元。
需要意识到的重要一点是,通常一对多关系实际上不会将任何列添加到作为“一”的表中。 Customer 没有额外的列来描述与Order 的关系。事实上,Customer 也可能与ShippingAddress 和SalesCall 表具有一对多关系,但没有向Customer 表添加其他列。
但是,对于要描述的多对一关系,通常会将id 列添加到“多”表中,该列是“一”表的外键——在本例中为 @ 987654348@ 列添加到Order。要将 12.34 美元的订单 #10 关联到 Bill Smith,我们将 customer_id 列分配给 Bill Smith 的 id 1。
但是,也可以有另一个表来描述Customer 和Order 关系,因此不需要向Order 表添加额外的字段。除了将customer_id 字段添加到Order 表之外,还可以有一个包含Customer 和Order 的键的Customer_Order 表。
customer_id,order_id
1,10
1,11
2,12
在这种情况下,one-to-many 和 many-to-one 都是概念性的,因为它们之间没有架构更改。哪种机制取决于您的架构和 SQL 实现。
希望这会有所帮助。