【问题标题】:Entity Relationship Model - Ternary operators实体关系模型 - 三元运算符
【发布时间】:2015-06-22 14:47:43
【问题描述】:

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

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

这个小实体关系模型是这样写的:

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

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

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

但也可以这样说:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    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,并且我们想找到他们的后代,我们可以将 People 直接加入到 OffSpring 中以找到他们,在 ID 字段上适当地添加到 MotherID 字段或 FatherID 字段。如果我们有一个 OffSpring 的 ID,我们可以将 OffSpring 直接加入到 MotherID 字段上的 People 或 FatherID 字段到 ID 字段。 parents 表主要是为了强制 1) 母亲和父亲被定义为一对,2) 母亲必须是女性,父亲必须是男性。

    对于阅读本文的每个人,请避免我们任何政治上正确的性别歧义废话。这仅用于说明。如果有人想要 Parent1 和 Parent2 而不是母亲和父亲,其中一个或两个都是男性或女性,那么就这样设计。

    【讨论】:

      【解决方案2】:

      您的示例不是三元关系之一。

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

      可以看到三元关系的示例,并在here 中进行了解释。从该页面:

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

      【讨论】:

      • 要代表给定后代(以及父亲/伙伴关系和母亲/伙伴关系)的“唯一一个”生育伙伴关系,用双短划线替换单破折号是否(甚至)更正确?还是您打算允许“单亲场景”(例如,有 1 个母亲、1 个伙伴关系和 1 个后代,但没有父亲)?
      • @Peter 我第一次了解到的鱼尾纹符号的变体是在德州仪器 (TI) 的 IEF 案例工具中实现的(我认为现在称为 Composer?)。 IEF 使用 Martin 表示法,或者至少是它的一种变体。在这个变体中,圆圈用于可选,没有圆圈意味着强制性,而不是使用破折号。在我的回答中,ERD 的意图是该关系在父端是强制性的,因此可以推断出第二个破折号。如果我使用的是教科书 Martin/IE 表示法,那么每个关系的“一个”端应该有两个破折号。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 2011-03-07
      相关资源
      最近更新 更多