2017-03-05 96 views
0

我必須創建一個有兩個不同表的關係的表。考慮下面的例子。使用兩個不同的外鍵創建一個表

可以說我有以下三個表:

現在我要做的是創建人表人的村莊或城鎮的外鍵引用
1) Person -> person_id, residence_type (V or T) 
2) Village -> village_id, village_name 
3) Town -> town_id, town_name 

。我想到了兩種方法。

一是創建一個residence_name的列,並從村或鎮表中輸入id,然後根據residence_type查詢它是否爲V或T.但是當然,我無法將其創建爲兩個不同表的外鍵引用同時。

另一種選擇是創建兩列 - 人表中的v_id和t_id,並根據residence_type填充一列。我可以再次查詢它,但肯定不能將它創建爲外鍵引用,因爲它不能爲NULL,但在這種情況下,一列將始終爲NULL。

這兩種方法哪個更好或者是否有更好的方法可以創建外鍵引用?

+0

是MySql還是Sql-Server?這是兩種不同的產品,每種答案都不相同。 –

+0

其MySQL主要我需要一個建議。但是,如果我經歷過更嚴格的SQL服務器,並且如果我需要遷移,我可能不得不記住它。 – Parry

+0

對於sql服務器來說,一種可能的解決方案是創建v_id和t_Id,使用一個檢查約束,只允許其中一個爲空。 MySql不強制檢查約束,因此它不會在那裏工作。這只是一個例子,也可能有其他例子。 –

回答

1

對我來說,它看起來像設計有點「如果」。我的假設是,對於一個人,你想知道他的住所是什麼,即最終名稱是村莊還是城鎮?

如果是這樣的話,我會刪除鄉村和城鎮表格,並將其替換爲包含鄉村和城鎮的居住查找表格,並且其中有一列到居住類型表格。該ResidenceType表看起來像這樣(這是SQL Server語法):

CREATE TABLE dbo.ResidenceType 
(
    ResidenceTypeID smallint NOT NULL, 
    ResidenceTypeDefinition nvarchar(25), 
    CONSTRAINT [pk_ResidenceType] PRIMARY KEY (ResidenceTypeID), 
); 

你會再填充該表所示:

INSERT INTO dbo.ResidenceType(ResidenceTypeID, ResidenceTypeDefinition) 
VALUES (1, 'Village'), (2, 'Town'); 

現在你可以創建一個住宅表,whoch將舉行這兩個城鎮和村莊的名字 - 它必須對ResidenceType表的外鍵:

CREATE TABLE dbo.Residence 
(
    ResidenceID int NOT NULL, 
    ResidenceTypeID smallint NOT NULL, 
    ResidenceName nvarchar(25), 
    CONSTRAINT [pk_Residence] PRIMARY KEY (ResidenceID), 
    CONSTRAINT [fk_ResidenceTypeID] FOREIGN KEY (ResidenceTypeID) 
    REFERENCES dbo.ResidenceType(ResidenceTypeID), 
); 

添加一些數據:

INSERT INTO dbo.Residence(ResidenceID, ResidenceTypeID, ResidenceName) 
VALUES (1, 1, 'Village 1'), 
     (2, 1, 'Village 2'), 
     (3, 2, 'Town 1'), 
     etc... 

最後你的人表看起來是這樣的:

CREATE TABLE dbo.Person 
(
    PersonID bigint NOT NULL, 
    ResidenceID int NOT NULL, 
    CONSTRAINT [pk_Person] PRIMARY KEY (PersonID), 
    CONSTRAINT [fk_Person_ResidenceID] FOREIGN KEY (ResidenceID) 
    REFERENCES dbo.Residence(ResidenceID), 
); 

那我會建議你做的方式。您現在正在遵循規範化等最佳做法。

+0

謝謝,這實際上對我很有意義,我想我傾向於使用它。但我有一個疑問。我需要單獨的表的原因是,一個列表是固定的,而另一個是可變的 - 使用簡單的例子來解釋它,因爲這個--- **可以說城鎮列表是固定的,不能改變爲用戶只能從一個具體的城鎮,但村名單是可變的,所以用戶可以在文本框中添加村名。因此,如果用戶居住在城鎮,用戶從城鎮的表格下拉列表中選擇,並且村莊用戶輸入名稱(爲此我創建了村莊表格)** – Parry

+0

您是否認爲您的方法也可以在這種情況下運行還是有更好的辦法分開城鎮和鄉村的桌子。 – Parry

+0

嗨帕裏,這是一個前端問題。即前端決定可以做什麼。所以我想說我給出的例子可以用於上面的場景。 –

相關問題