我试图为我的项目管理软件绘制ER图 描述以下内容。它包含这些实体:
和
项目可分为任务。 (任务可以由管理员用户创建,管理员可以将这些任务分配给选定的项目。这里只分配任务到项目,而不是将员工分配给项目。)
可以将员工分配到项目中 (可以将员工分配到项目。这里只有员工分配给项目,而不是分配给项目任务。)
对于所选项目的选定任务,我们可以从池中分配员工 - 分配给该项目的员工2。 (这次我们必须指定项目,任务和员工;所有3个选项都是强制性的。)
1,2&的输入过程上面的图3可以在系统的单独页面中完成。 您可以先选择其中任何一个。
对于上述关系,我创建了这个ERD:
考虑
是否需要ER图中的两个独立关系, 关系1号&关系没有2?
或
我们可以只使用项目,员工和任务之间的关系3,关系3吗?
答案 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 unique
,primary key
& join
不是这些名称的关系,因为它们特别对待null
。)
PS 6 Has
是一个无用的通用关系名称/含义/表格。使用有意义的名称,例如Is_assigned_to
或Assignment
。