2014-02-27 48 views
0

例如,如何可以创建表InsuranceCoVehicle,其中每个的主键InsuranceCo.idVehicle.licencePlate之间的一对多的关系?1对许多上的键SQL关系与不同类型的

我创建使用外键的一到多的关系的尝试是这样的:

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

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

将这项工作?如果不是,那么当键具有不同类型时,如何创建一对多关系?

+0

外键必须是相同的类型和大小,但是,多对多关系是通过引用它们的中间表构造的。 – Mihai

回答

2

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

您必须将一列(例如insuranceCoId)添加到Vehicle表中。那么任何车辆都可以在桌面上拥有保险公司的身份证件。因此,在数据可能是这样的:

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

我假设在一对多关系中,InsuranceCo将具有多重性1并且车辆将具有*(许多)的多重性。

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

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

现在,当您添加车辆系统,您可以添加相关保险公司引用。

上述内容将解决您的疑问。但是,我相信你的数据库设计可以通过添加一个InsurancePolicy表来改进,这个表可以创建Vehicle和InsuranceCo之间的多对多关系,并与特定于策略的信息(例如溢价,抵扣等) )。

1

您不能与不同类型的按键具有一对多的关系。这是一个糟糕的数据库设计的例子。 licencePlate不应该是该表中的主键或外键。当有人更新车牌时,会发生什么,其他表格中的一些记录与旧车牌有关?您应该将设计更改为类似这样:

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

确保您的主键是自动递增(或您的应用程序正确处理它们)。使用insuranceId作为保险公司的一对多关系...

0

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

使用你的例子:如果你是以下你可以看到InsuranceCo和车辆完全互为独立的,并且可以通过一些自动化的脚本来填充

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
编号1,电话07944555554
编号2,电话07944555557

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

车辆保险公司
编号1,VehicleId 1,InsuranceCoId 1个
编号2,VehicleId 2,InsuranceCoId 1

所以从数据集中,我们可以看到有2辆在保险公司1号和车辆保险公司2.

如果在使用这种模式时有任何可能的问题,请在我的脑海中告诉我,当表变得难以管理时,这可以解决数据库中经常发生的问题,因为它们有专门的后面添加的列,而没有考虑很多将存在的空行。

+0

这里有一个有趣的讨论https://www.quora.com/Should-I-always-use-many-to-many-relationship-in-database-design – ozzy432836