实体关系模型 - 三元运算符

时间:2015-04-16 09:28:02

标签: database-design entity-relationship ternary-operator

目前,我正在使用数据库。为此,我创建了一个实体关系模型,但在涉及三元运算符时,我有一个小问题。让我们来看看这个例子:

             -------------  (0|N)                    (0|N)  -------------
             |   Mother  |-----------------x----------------|   Father  |
             -------------                 |                -------------
                                           |
                                           |
                                           |
                                           |
                                           | (1|1)
                                     -------------
                                     |   Child   |
                                     -------------

这个小实体关系模型如下所示:

  

母亲可以有1到N个孩子 - 好的

     

父亲可以有1到N个孩子 - 好的

     

一个孩子有1个父亲和1个母亲 - 好的

但也有可能说:

  

父亲有N个母亲 - 不行

     

一位母亲有N个父亲 - 不行

那么我是否理解错误或者这些三元运算符不明显?通过此实现,可以创建不一致的数据集。对于这些操作员来说,这个方向是否很重要,还是我必须以另一种方式阅读它们?

2 个答案:

答案 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,正确适合您的业务规则:

ERD

可以看到三元关系的一个例子,并解释here。从该页面:

  

课程设置必须至少有一个人,但可能有很多人(至少有两个人会想:教师和一个孤独的学生),一个人可能会以某种方式参与许多课程,或者根本没有。关系的角色属性表明该人在提供中的角色:学生,教师等。