例如,如何在表InsuranceCo
和Vehicle
之间创建一对多关系,其中每个关键字都是InsuranceCo.id
和Vehicle.licencePlate
?
我尝试使用外键创建一对多关系是:
CREATE TABLE InsuranceCo (
id int PRIMARY KEY,
phone int
)
CREATE TABLE Vehicle (
licencePlate CHAR(10) PRIMARY KEY REFERENCES InsuranceCo(id),
year int
)
这会有用吗?如果没有,当键有不同类型时,如何创建一对多关系?
答案 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中没有车辆。
如果在使用此模式时可能出现任何问题,请在我的脑海中告诉我,当表格变得无法管理时,这可以解决数据库中经常出现的问题,因为它们的列有后来临时添加但没有考虑到将存在的空行。