具有不同类型的键上的一对多SQL关系

时间:2014-02-27 19:30:19

标签: sql

例如,如何在表InsuranceCoVehicle之间创建一对多关系,其中每个关键字都是InsuranceCo.idVehicle.licencePlate

我尝试使用外键创建一对多关系是:

CREATE TABLE InsuranceCo (
   id int PRIMARY KEY,
   phone int
)

CREATE TABLE Vehicle (
       licencePlate CHAR(10) PRIMARY KEY REFERENCES InsuranceCo(id), 
       year int
)

这会有用吗?如果没有,当键有不同类型时,如何创建一对多关系?

4 个答案:

答案 0 :(得分:2)

这不是一对多关系的工作方式。您不只是将两个ID链接在一起,这就是一对一关系如何工作(不,不能用不同的类型完成,值实际上必须相同)。对于一对多关系,您需要一个单独的值来引用另一个表。

您必须在Vehicle表中添加一列(例如insuranceCoId)。然后任何车辆都可以在表格中找到保险公司的ID。所以数据可能如下所示:

InsuranceCo:

id   phone
1    800-744-2932
2    488-382-9332

Vehicle
LicencePlate    insuranceCoId    year
435yte          1                1995
328teo          1                2006
fd8tew          2                2008

如您所见,一家保险公司现在与许多车辆相关联。

答案 1 :(得分:1)

我假设在一对多的关系中,InsuranceCo的多重性为1,而Vehicle的多重性为*(很多)。

在这种情况下,您需要在类型为int的Vehicle表上创建一个名为InsuranceCoId的附加列,该列将是InsuranceCo表的外键引用。然后,您可以在Vehicle表本身上创建所述外键约束:

ALTER TABLE Vehicle 
ADD CONSTRAINT FK_Vehicle_InsuranceCo 
FOREIGN KEY (InsuranceCoId) 
REFERENCES InsuranceCo (id) 

现在,当您向系统添加车辆时,您可以添加相关的保险公司参考。

以上内容将解决您的直接问题。

但是,我相信您的数据库设计可以通过添加一个InsurancePolicy表来改进,该表将在Vehicle和InsuranceCo之间创建多对多关系,并与特定于策略的信息(例如溢价,免赔额等)捆绑在一起。

答案 2 :(得分:1)

您不能与不同类型的密钥建立一对多的关系。这是数据库设计不佳的一个例子。 licencePlate不应该是该表中的主键或外键。当有人更新车牌并且其他表中的某些记录与旧表相关时会发生什么?您应该将设计更改为以下内容:

CREATE TABLE Vehicle (
       vehicleId int PRIMARY KEY,
       insuranceId int,
       licencePlate CHAR(10), 
       year int,
       FOREIGN KEY (insuranceId) REFERENCES InsuranceCo(Id)
)

确保主键自动递增(或者您的应用程序正确处理它们)。使用insuranceId与InsuranceCo的一对多关系......

答案 3 :(得分:0)

我正在考虑为我的组织中的大多数(如果不是全部)实体建立多对多的关系。

使用您的示例:

CREATE TABLE InsuranceCo (
    Id int PRIMARY KEY,
    Phone int
)

CREATE TABLE Vehicle (
    Id int PRIMARY KEY,
    LicencePlate CHAR(10),
    Year int
)

CREATE TABLE VehiclesInInsuranceCo (
    Id int,
    VehicleId FOREIGN KEY REFERENCES Vehicle(Id),
    InsuranceCoId FOREIGN KEY REFERENCES InsuranceCo(Id)
)

如果您关注,您可以看到InsuranceCo和Vehicle完全相互独立存在,并且可以通过一些自动脚本填充。

如果您想将车辆连接到保险公司,您可以这样做:

InsuranceCo
Id 1,Phone 07944555554
Id 2,电话07944555557

车辆
Id 1,LicensePlate K1NGS,2016年
年 Id 2,LicensePlate S0L1D,2015年

VehiclesInInsuranceCo
Id 1,VehicleId 1,InsuranceCoId 1
Id 2,VehicleId 2,InsuranceCoId 1

因此,从数据集中,我们可以看到保险公司1中有2辆车,保险公司2中没有车辆。

如果在使用此模式时可能出现任何问题,请在我的脑海中告诉我,当表格变得无法管理时,这可以解决数据库中经常出现的问题,因为它们的列有后来临时添加但没有考虑到将存在的空行。