Database design 实体关系模型-三元算子

Database design 实体关系模型-三元算子,database-design,entity-relationship,ternary-operator,Database Design,Entity Relationship,Ternary Operator,目前,我正在处理一些数据库。为此,我创建了一个实体关系模型,但当涉及到三元运算符时,我在阅读它时遇到了一个小问题。让我们看看这个例子: ------------- (0|N) (0|N) ------------- | Mother |-----------------x----------------| Father | -------------

目前,我正在处理一些数据库。为此,我创建了一个实体关系模型,但当涉及到三元运算符时,我在阅读它时遇到了一个小问题。让我们看看这个例子:

             -------------  (0|N)                    (0|N)  -------------
             |   Mother  |-----------------x----------------|   Father  |
             -------------                 |                -------------
                                           |
                                           |
                                           |
                                           |
                                           | (1|1)
                                     -------------
                                     |   Child   |
                                     -------------
此小型实体关系模型如下所示:

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

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

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

但也可以说:

一个父亲有N个母亲——不好

一个母亲有N个父亲——不好


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

您的示例不是三元关系

以下是一个更准确的ERD,它正确地符合您的业务规则:

可以看到并解释三元关系的示例。从该页:

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

你的主要实体是人。母亲、父亲和后代是人与人之间的关系

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和Sex的组合是唯一的

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,并且我们想要找到他们的后代,我们可以在ID字段到MotherID字段或父辈ID字段(视情况而定)上直接将人们加入到后代中来找到他们。如果我们有一个后代的ID,我们可以将后代直接连接到MotherID字段或FatherID字段到ID字段上的人。父母表主要是为了强制执行1)母亲和父亲被定义为一对,2)母亲必须是女性,父亲必须是男性


对于每一个读到这篇文章的人,请不要给我们任何政治上正确的性别模糊的废话。这仅用于说明。如果有人想要父母1和父母2而不是母亲和父亲,其中一方或双方都是男性或女性,那么就这样设计。

为了代表给定后代的“一个且唯一的”生育伙伴关系(以及父亲/伙伴关系和母亲/伙伴关系),它会是(偶数)吗用双破折号替换单破折号更正确?或者你打算允许“单亲场景”(例如,有一个母亲、一个伙伴关系和一个后代,但没有父亲)?@Peter我第一次学习的鱼尾纹符号变体是德克萨斯仪器公司(我想现在称为Composer?)在IEF case工具中实现的。IEF使用了马丁符号,或者至少是其变体。在此变体中,圆圈用于可选,没有圆圈意味着必须,而不是使用破折号。在我的回答中,ERD的目的是在父端强制关系,因此可以推断第二个破折号。如果我使用教科书中的Martin/IE符号,那么在每个关系的“一”端应该有两个破折号。