假设我有一个名为' Name'的父表。和两个名为' MaleName'和女性姓名'。
但有些名字是男性和女性都可以拥有的,(在亚洲国家/地区更为常见)。所以我需要在MaleName和FemaleName表中存储这样的名称。但这会引发冗余并且感觉不对,或者我添加第三个表作为“CommonName'保持这样的名字,再次感觉不对。
那么,解决这个问题的最佳做法是什么?
答案 0 :(得分:3)
如果它并不比你的例子复杂,那么首先拥有多个表是多余的,只需在你的名字表上有两列来标记它是男性还是女性,例如
CREATE TABLE Name
(
Name VARCHAR(255) NOT NULL,
Male BIT NOT NULL,
Female BIT NOT NULL
);
如果您绝对需要MaleName
和FemaleName
作为对象,那么您始终可以创建视图:
CREATE VIEW dbo.MaleName
AS
SELECT Name
FROM dbo.Name
WHERE Male = 1;
假设这不像你的例子那么简单,那么处理这个的一个相当常见的方法是使用associative entity (junction table),所以你最终得到3个表,比如
名称(NameID(PK),名称)
性别(性别ID(PK),说明)
NameGender (NameID(PK,FK),GenderID(PK,FK))
最后,如果您设置了继承方法,那么如果您正确执行此操作,则不应导致冗余。男性和女性名称共有的任何属性都应存储在父表中,因此两个子表中的任何信息都不会是多余的