ER图中3个实体之间的关系 - 是否足够三元或者还需要2个二进制文件?

时间:2017-08-07 16:12:40

标签: database database-design relational-database database-schema entity-relationship

我试图为我的项目管理软件绘制ER图 描述以下内容。它包含这些实体:

  • 项目 - 软件项目
  • 任务 - 可以分成许多任务的软件项目
  • 员工 - 属于此软件的员工

  1. 项目可分为任务。 (任务可以由管理员用户创建,管理员可以将这些任务分配给选定的项目。这里只分配任务到项目,而不是将员工分配给项目。)

  2. 可以将员工分配到项目中 (可以将员工分配到项目。这里只有员工分配给项目,而不是分配给项目任务。)

  3. 对于所选项目的选定任务,我们可以从池中分配员工 - 分配给该项目的员工2。 (这次我们必须指定项目,任务和员工;所有3个选项都是强制性的。)

  4. 1,2&的输入过程上面的图3可以在系统的单独页面中完成。 您可以先选择其中任何一个。

    对于上述关系,我创建了这个ERD:

    enter image description here

    考虑

    • 项目与任务之间的关系1
    • 项目与员工之间的关系2

    是否需要ER图中的两个独立关系, 关系1号&关系没有2?

    我们可以只使用项目,员工和任务之间的关系3,关系3吗?

1 个答案:

答案 0 :(得分:3)

TL; DR 您需要所有三种关系类型/表格。因为如果丢弃一个,那么在某些情况下会丢失数据 - 没有办法使用其余的来回答所有相同的问题。

规范化到更高的NF(正常形式)告诉我们何时可以用更小/更简单的替换关系/表。

每个关系表都包含参与关系的行。我们可以通过谓词(语句模板)来描述这种关系:

1 Divides_to包含(T, P)行的project P divides to task T行 2 Has保留(E, P)employee E is assigned to project P 3包含(E, T, P)

employee E is assigned to task T on project P

我们能掉1吗?如果我们忽略3中的员工,那么我们会得到some employee is assigned to task T on project P行。但是(上面)不是1中的行。也许项目P除以1中的任务T,但没有员工被分配给项目P上的任务T;然后,1中的行不是3中的子行。并且2中没有任务信息。所以我们不能使用3& 2替换1。

我们能掉2吗?同样,如果我们忽略3中的任务,那么我们就不会得到2,并且1中没有员工信息。所以我们不能使用3& 1替换2。

我们可以掉3吗?使用1& 2我们可以获得employee E is assigned to project P AND project P divides to task T的行。但是(如上所述)不是3中的行。如果分配给项目的员工未分配给其所有任务,或者项目的任务没有分配给它的所有员工,则它们会有所不同。没有其他方法可以从1&所以我们不能使用1& 2替换3。

所以我们需要所有三种关系。

归一化到更高的NFs指南将一个关系分解为更简单的其他关系,通过它可以表达它。

PS 1这也是我们需要实体类型/表而不仅仅是关系类型/表的原因。 (如果我们不想要它们用于特定于实体的属性或仅仅是ER建模约定。)例如,这三个关系无法告诉您未分配给项目或任务的员工。项目。同样适用于任务和对于项目。

PS 2我们忽略关系代数中的一个属性而不是project。我们忽略SQL中的一列而不是select它。结果的谓词是属性/列的FOR SOME值,旧谓词成立。关系natural join给出其关系/谓词是输入关系/谓词的AND的行。在SQL中没有重复的行&没有共享可为空的列select distinct from natural join

PS 3您的设计满足某些约束条件:如果任务项目对出现在3中,那么它必须出现在1中,如果员工项目对出现在3中,那么它必须出现在2中。一种方式在ER中反映出来建模是通过实现任务项目和工作来实现的。员工 - 项目与关联实体的关系,然后由ER在实体上调用二元关系替换3。关系上,关系/表仍然是三元的,其中某些子集恰好识别那些实体。获得约束关系二进制3的方法是在2中添加雇员项目PK(主键)或CK(候选键)id,并用这样的id替换3中的复合FK(外键)。然后我们在实体和值上有二进制文件。一些伪ER方法可以做到这一点。

PS 4这种(真正的陈)ER图表通常不使用SQL空值。但是当它发生时,你可以用3的变量替换所有三个关系。你会null - 扩展二元关系,并用三元组union扩展它们。像往常一样,nulls使谓词复杂化。通常我们添加一个可空列作为添加共享无空CK(候选键)的单独表的替代方法。但这是不同的,没有节省空间或连接;它只会让事情复杂化。 (包括重要的约束。)

    E IS NULL
AND task T is of project P
AND NOT EXISTS E [employee E is assigned to task T of project P]
OR  T IS NULL
AND employee E is assigned to project P
AND NOT EXISTS T [employee E is assigned to task T of project P]
OR  employee E is assigned to task T of project P

(在SQL中也存在问题,因为SQL uniqueprimary key& join不是这些名称的关系,因为它们特别对待null。)

PS 5我的一些答案是这样的三元与二元关系(船)类型/表/谓词:
Should this ER diagram use a ternary relationship instead
Best Solution - Ternary or Binary Relationship
Why can't you just join in fan trap?
重新设计&谓词:
Modeling multiple many to many relationships between the same entities in a relational database
What is the difference between an entity relationship model and a relational model?
Is there any rule of thumb to construct SQL query from a human-readable description?

PS 6 Has是一个无用的通用关系名称/含义/表格。使用有意义的名称,例如Is_assigned_toAssignment