对我来说,它看起来像设计有点“如果”。我的假设是,对于一个人,你想知道他的住所是什么,即最终名称是村庄还是城镇?
如果是这样的话,我会删除乡村和城镇表格,并将其替换为包含乡村和城镇的居住查找表格,并且其中有一列到居住类型表格。该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不强制检查约束,因此它不会在那里工作。这只是一个例子,也可能有其他例子。 –