繁体   English   中英

SQL中的一对多关系

[英]One To Many Relationship in SQL

我试图理解“一对多关系”。 假设我有两个表: PersonVehicle

Person表中,我有2列: personidpersoname personidprimary key 我的Person表中有2行:

personid | personname
---------+-----------
1        | Rajesh
2        | Suresh

在“ Vehicle表中,我有2列: vehicleidvehiclename Vehicle表中有一行

vehicleid | vehiclename
----------+------------
1         | Car

现在,根据“一对多关系”,每个人可以拥有零辆,一辆或多辆车。

那么, RajeshSuresh可以映射到Car吗?

例如:

Rajesh -+- Car
Suresh -/

在“一对多关系”中,两个不同的Person可以引用同一Vehicle吗? 还是应该每Vehicle只能被映射到一个单一的Person

在“多对一关系”中,“ Vehicle表中唯一的Vehicle可以映射到“ Person表中的多个人,对吗?

您需要多对多的“关系”。 它实际上是2对一对多关系的组合。 在sql中执行此操作的唯一方法是拥有第三个表。

PersonID名称

一对多(一个人可以拥有许多车辆)

所有权(或标题?) PersonID车辆ID

多对一(车辆可以有很多所有者)

车辆 caridid 车辆名称

所有权表对于任何用户/车辆组合都有一个潜在的行(并且应该使该组合成为主键或至少一个唯一约束)。

可以在所有权表中放置其他字段,例如购买日期和金额,销售日期和金额等。因为这些字段与车辆的所有权有关,与所有者或车辆本身的财产无关。

您的问题前后矛盾,您说“ 每个人可以拥有零个,一个或多个车辆 ”,然后您问“ 现在可以将Rajesh和Suresh都映射到Car吗?”,这意味着每个车辆可以有多个所有者, 而不是每个所有者一个人可以有多辆车...

假设要将每辆车的所有权限制为一个人(实际上,一辆车可以由多个人拥有),并允许一个人拥有多辆车,只需将PersonId添加到vehicle表中,以指示或指向拥有该车辆的个人。

因此,您的车辆表将是

vehicleid OwnerId vehiclename
    1        1       'Ford'
    2        1       'Maserati'
    3        1       'BMW'

如果Rajesh和Suresh都拥有相同的载具,并且每个载具可能都具有不止1辆载具,那么您将具有多对多关系。

但是,如果一辆车只能由一个人拥有,那么您将在人与车之间建立一对多关系。

在一对多关系中,两个不同的人可以在车辆表中引用该车

没有。 2不是一个。

从Vehicle的角度来看,它对多人行具有1(一行,即“ Car Row”)(假设Person表具有VehicleId列)

Many to OneOne to Many是指相同的概念,只是从不同的角度看。 (来自车辆或人)。

在标准的“一对多”中,您将拥有

人员表和车辆表,其中,车辆表包含带有指向该人员表的FK的personId。 这将使您为一个人建模,该人拥有0个或一个人拥有的许多车辆。

如果车辆有多个所有者,则应在人与车辆之间引入多对多关系。 那将需要第三个表(PersonVehicle)

在您的示例中,Rajesh和Suresh可以共享同一辆车来执行此操作,而您需要在人员表中使用车主键。

Rajesh与CarA有一种关系Suresh与CarA有一种关系

和CarA会有很多关系(Rajesh和Suresh)。

现在,根据“一对多关系”,每个人可以拥有零辆,一辆或多辆车。

正确。

那么, RajeshSuresh可以映射到Car吗?

不,不是“一对多关系”。 这将是“多对多关系”。

在“一对多关系”中,两个不同的Person可以引用同一Vehicle吗? 还是应该每Vehicle只能被映射到一个单一的Person

每个Vehicle只能链接到一个 Person

在“多对一关系”中,“ Vehicle表中唯一的Vehicle可以映射到“ Person表中的多个人,对吗?

是的,但是每个Person只能链接到单个 Vehicle

相反,“多对一”和“一对多”是同一回事。 因此,以下两个语句是等效的:

  1. 一个 A可以链接到多个 B
  2. 许多 B可以链接到一个 A

请注意每个(粗体)中的“一对多”和“多对一”,以及为了表示同一件事,如何将表AB交换?

例子

假设以下内容:

Person      Vehicle
------      -------
Jane        Car
John        Truck

一对一

JaneCar 每个Person一次只能链接到一辆 Vehicle ,反之亦然。

Jane--------Car
John        Truck

一对多

JaneCar Truck Vehicle一次只能链接一个 Person 每个Person都可以链接到多个Vehicle

Jane---+----Car
John    \---Truck

多对一

Jane JohnCar有联系。 每个Person一次只能链接到一辆 Vehicle 每个Vehicle可以链接到多个Person

Jane----+---Car
John---/    Truck

多对多

每个Vehicle可以链接到多个Person ,反之亦然。

Jane John Car Truck

Jane---+--+-Car
        \/
        /\
John---+--+-Truck

Jane链接到Car and TruckJohn链接到Truck

Jane---+----Car
        \ 
John-----+--Truck

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM