目前,我正在使用数据库。为此,我创建了一个实体关系模型,但在涉及三元运算符时,我有一个小问题。让我们来看看这个例子:
------------- (0|N) (0|N) -------------
| Mother |-----------------x----------------| Father |
------------- | -------------
|
|
|
|
| (1|1)
-------------
| Child |
-------------
这个小实体关系模型如下所示:
母亲可以有1到N个孩子 - 好的
父亲可以有1到N个孩子 - 好的
一个孩子有1个父亲和1个母亲 - 好的
但也有可能说:
父亲有N个母亲 - 不行
一位母亲有N个父亲 - 不行
那么我是否理解错误或者这些三元运算符不明显?通过此实现,可以创建不一致的数据集。对于这些操作员来说,这个方向是否很重要,还是我必须以另一种方式阅读它们?
答案 0 :(得分:2)
您的主要实体是人。母亲,父亲和后代是人与人之间的关系。
create table People(
ID int primary key auto_generated,
Sex Char( 1 ) check( Sex in( 'F', 'M' )),
...
);
create unique index UQ_People_Parent on People( ID, Sex );
如果ID本身是唯一的,为什么要组合ID&性别独特?
create table Parents(
MotherID int,
FemaleFlag char( 1 ) check FemaleFlag = 'F',
FatherID int,
MaleFlag char( 1 ) check MaleFlag = 'M',
constraint FK_Parent_Mother foreign key( MotherID, FemaleFlag )
references People( ID, Sex ),
constraint FK_Parent_Father foreign key( FatherID, MaleFlag )
references People( ID, Sex ),
constraint PK_Parents primary key( MotherID, FatherID )
);
这将设置一个m-n交叉表。这很好,因为父母可以有不同配偶的孩子。国旗的加入使我们能够强制执行母亲必须是女性的限制,父亲必须是男性。
create table OffSpring(
PersonID int primary key,
MotherID int,
FatherID int,
constraint FK_OffSpring_Parents foreign key( MotherID, FatherID )
references Parents( MotherID, FatherID ),
constraint FK_Offspring_Person foreign key( PersonID )
references People( ID )
);
后代可以是女儿或儿子,因此根据性别没有区别。
如果我们拥有父母的ID并且我们想要找到他们的后代,我们可以直接将人们加入OffSpring以在ID字段中将其添加到MotherID字段或FatherID字段中。如果我们有OffSpring的ID,我们可以将OffSpring直接加入到MotherID字段的People或者FatherID字段到ID字段。父母表主要是强制执行1)母亲和父亲被定义为一对,2)母亲必须是女性,父亲必须是男性。
对于阅读此内容的所有人,请饶恕我们任何政治上正确的性别含糊不清的废话。这仅用于说明。如果有人想要Parent1和Parent2而不是母亲和父亲,其中一方或两方都是男性或女性,那么就这样设计。
答案 1 :(得分:1)
你的榜样不是三元关系之一。
这是一个更准确的ERD,正确适合您的业务规则:
可以看到三元关系的一个例子,并解释here。从该页面:
课程设置必须至少有一个人,但可能有很多人(至少有两个人会想:教师和一个孤独的学生),一个人可能会以某种方式参与许多课程,或者根本没有。关系的角色属性表明该人在提供中的角色:学生,教师等。