UML 图和弱实体的多重性

UML Diagram and Multiplicity with weak entities

您好,我开始尝试 SQL 和数据库设计。 我了解事物的 SQL 方面,但尝试绘制图表有点令人困惑。

考虑这些业务规则:

如果一名实习生一次只能做 1 个项目,但业务规则说随着时间的推移,他们可能会接受多个项目。如何保留以前的项目?

谁能告诉我多重性?

编辑: 抱歉,我认为它添加了我的屏幕截图:

A Trainee at most belongs 1 trainee project at a time

这可以通过一个约束来证明,即对于给定的受训者,项目的日期永远不会重叠。

在 OCL 中,约束可以写成:

context Trainee inv:
 self.ProjectHistory->forAll(h1,h2 |
                             h1<>h2 implies (h1.dateCompleted < h2.dateStarted) or
                                            (h1.dateStarted > h2.dateCompleted))

还有:

context ProjectHistory inv:
   self.dateStarted <= self.dateCompleted

假设 dateCompleted 设置为项目进行时的当前日期,并且我们知道项目正在进行其他方式。

如果项目正在进行时 dateCompleted 值为 0 :

context ProjectHistory inv:
  (self.dateStarted > 0) and 
  ((self.dateCompleted = 0) or (self.dateStarted <= self.dateCompleted))

context Trainee inv:
  self.ProjectHistory->select(dateCompleted = 0)->size() <= 1

context Trainee inv:
  self.ProjectHistory
    ->forAll(h1,h2 | 
             h1<>h2 implies 
               if h1.dateCompleted = 0 then
                 h1.dateStarted > h2.dateCompleted
               else 
                 if h2.dateCompleted = 0 then
                   h2.dateStarted > h1.dateCompleted
                 else
                   (h1.dateCompleted < h2.dateStarted) or 
                   (h1.dateStarted > h2.dateCompleted)
                 endif
               endif
             )

其中使用 association-class 是正确的方法。

Over time, Trainees may take more than one project.

所以任何数字,重数0..1必须是0..*或快捷方式*

乘数必须是 0..1 如果该规则和之前的规则被替换为 (随着时间的推移)一个实习生最多属于 1 个实习生项目

A section may run more than one project.

所以任何数字,重数1..*必须是0..*或者快捷方式*

A Project can have may trainees

可能明显很多所以高数不是1.

只有 a project have many trainees 可能意味着最小数量是 ,1 但 can have 最小数量是 0 而不是 1。

所以最终重数是0..*或快捷方式*,而不是1..1

How would previous projects get retained?

他们多亏了多样性0..*而不是0..1,受训者与正在进行的项目没有关系(如果存在的话)

总结:

对象图示例:

您可以检查是否遵守了所有规则。


在某些情况下,您的属性名称包含 class 的名称,例如 projectName 和 traineeId ,这是没有用的,我建议您删除属性名称中的 class 名称。

“项目”一词含糊不清。标准含义是一个项目由不同项目参与者执行的各种 activities/tasks 工作包组成。这样的项目,当然是有开始和结束时间的。

“项目”的另一个次要含义是教育,类似于定义为任务类型的作业,任何学生都可以随时started/done。

我的模型参考了第一个(更常见的)概念。

为了表达“一个受训者一次最多属于 1 个受训者项目”的约束,必须以附加到 Trainee class 的不变量(框)的形式来表达,例如所以:

没有 ocl 的解决方案直观地描述了所需的语义:

每个 Trainee-Project 个协会都有一个开始日期,但只有 Completed Trainee-Project 个协会有一个结束日期。这是直截了当的,也是我们在日常英语中表达它的方式。那么为什么不在 class 图表中这样做呢?那么很容易表达,每个 Trainee 最多只能有一个当前项目。通过使其结束派生,我们可以说,关联的类型定义了结束显示的位置 - 在 current projectcompleted projects.

link 必须随时间将其 AssociationClass 从 current Trainee-Project 更改为 completed Trainee-Project。如果这对您来说听起来很奇怪,您可能会从编程语言的角度来思考。它们中的大多数不支持动态重新class化。但事实上这就是现实。实习生有一天会成为一名雇员。 classes 它们是 a-changin',正如一位伟大的诗人曾经说过的那样(据我所知 ;-)

你可能会说,SQL不支持这个。嗯,是的,但它也不支持 n:m 关系。所以无论如何你都需要将你的域模型映射到 SQL 。所以,让你的领域模型尽量贴近你的需求,以后再考虑映射到SQL。