對我來說,它看起來像設計有點「如果」。我的假設是,對於一個人,你想知道他的住所是什麼,即最終名稱是村莊還是城鎮?
如果是這樣的話,我會刪除鄉村和城鎮表格,並將其替換爲包含鄉村和城鎮的居住查找表格,並且其中有一列到居住類型表格。該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),
);
那我會建議你做的方式。您現在正在遵循規範化等最佳做法。
是MySql還是Sql-Server?這是兩種不同的產品,每種答案都不相同。 –
其MySQL主要我需要一個建議。但是,如果我經歷過更嚴格的SQL服務器,並且如果我需要遷移,我可能不得不記住它。 – Parry
對於sql服務器來說,一種可能的解決方案是創建v_id和t_Id,使用一個檢查約束,只允許其中一個爲空。 MySql不強制檢查約束,因此它不會在那裏工作。這只是一個例子,也可能有其他例子。 –