代码之家  ›  专栏  ›  技术社区  ›  MatthiasG

ERD-如何用第三个实体作为“属性”对两个实体之间的关系建模

  •  3
  • MatthiasG  · 技术社区  · 15 年前

    我正在为一个实体关系图建模,结果卡住了。我不确定我的考虑是错的,还是ERD无法模拟我想要的:

    3 回复  |  直到 15 年前
        1
  •  3
  •   PerformanceDBA    15 年前

    如何建立关系模型。。。实体。。。属性?

    在设计数据库之前,我希望将问题建模为实体关系图(使用Chen的符号)。在这个图中,我想在雇员和项目之间创建一个关系,而不必查看下面的键和约束。 补遗:我只知道两个实体之间的关系是由属性扩展的,但我如何建模这个“三实体关系”?

    这完全可以理解,而且非常正确。纸张很便宜,数据库中的对象更改起来要贵一些。建立需求模型并不断改进,直到你有信心, 实施。

    另一种说法是,OMG回答了一个问题 孤立地;我在上下文中回答你的全部问题。

    没有其他考虑 在物理级别上呈现为关联表。但再次重申,现在决定这一点还为时过早,因为你仍在为这种关系的背景和意义建模。

    ... 也不在标记符号的范围内提供它。IME,Oracle Designer之类的工具在创建实体之后生成这样的关系图

    建模、进展示例

    使用任何对你有意义的符号,来模拟你所需要的。当然,标准符号更为普遍理解。这是一个
    ERD for you
    可以 发生。什么都不是“对”或“错”,都是纸片;直到 决定哪些元素值得确认,然后下一步就有可能了。

    1. 当然,起点是简单的多对多关系 知道 一些 关于,根据你的头衔。试图建立一个概念上的三方关系模型是不正确的,这是一个建模错误:为了解决三角关系,你需要首先分别确定双方之间的离散关系;这意味着所有关系都是双向的。

    2. 项目、员工和角色实体都很清楚,我们对它们有所了解。在这里,我让主要的实体没有被开发,因为它们是“强大的”,它们不是你所关注的。

    3. 关系的属性

    4. 我假设 关系的属性 证明一个实体是正确的,所以我现在把它们画进去了。在这里我用了椭圆,你可以用钻石或雪佛龙为所有我关心的,只是用一些符号,以模型什么你需要。

    5. 这里我们可以清楚地看到:我们不希望Project::Employee::Role,因为这将允许员工执行任何角色;我们希望仅当员工以前已被批准担任该角色时才选择他们。所以,Employee::角色正在变得“更强”。

    6. 因此,Employee::Role是一个实体。粉色部分是特定组合或Employee+角色的子项,而不是所有Employee或所有角色的子项。

    7. 同样,我们不希望任何员工在任何可能的项目中从事任何可能的工作,我们只希望他们在批准的项目中从事批准的工作。所以Project::Role正在成为一个强身份,而且它无论如何都有属性。

    8. 我们粉红的孩子获得了实体的地位,有其特定的属性。更重要的是,它的约束来自于以前的约束实体,而不是简单的实体。

    9. 数据有一个自然的顺序或层次结构,用它绘制的图表很容易理解。我们现在有机会看看这些属性。它们可能看起来相同或相似或令人困惑;但现在由于上下文和层次关系,它们有了明确的含义。

    我已经介绍了 ,如果有必要的话,我将把它留给讨论,而不扩大它。我认为您可以看到,标识符实际上非常非常重要,它们作为建模练习的一个普通部分公开。

    请反馈,这样你才能进步。

    编辑:图表更新,多页。

        2
  •  5
  •   OMG Ponies    15 年前

    • 员工id(pk)

    项目

    • 项目id(pk)

    角色

    • 角色描述

    如果员工每个项目只能有一个角色:

    员工计划图

    • 项目id(pk,fk到项目)
    • 员工id(主键,fk到员工)

    如果员工每个项目只能有1个以上的角色:

    员工计划图

    • 项目id(pk,fk到项目)
    • 角色id(pk,fk到角色)

    两者的区别在于复合主键在后一个版本中包含role。作为一个 混合成的

    project_id  employee_id  role_id
    ---------------------------------
    1           1            1
    1           1            2
    

    如果角色id是 可以将用户和项目组合起来-这意味着用户只能有一个角色。

    CHECK约束不起作用-它只检查行,而不是整个表。虽然触发器可以工作,但是当您可以通过组合主键或唯一约束来强制关系时,为什么还要费心呢?一个触发器在ERD中是不可见的,也不能像 CREATE TABLE DESC table_name .

        3
  •  1
  •   Erwin Smout    15 年前

    “在设计数据库之前,我想将问题建模为实体关系图(使用Chen的符号)。在这个图中,我想在员工和项目之间创建一个关系,而不必查看下面的键和约束。”