2014-02-27 47 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