1

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

考虑以下业务规则:

  • 受训者有姓名、受训者 ID 和电子邮件。
  • 一个受训者一次最多属于一个受训项目
  • 随着时间的推移,受训者可能会参加一个以上的项目。
  • 每个项目都有一个名称和一个项目代码。一个程序由一个部分运行。一个部分可以运行多个项目。
  • 一个项目可以有很多学员

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

有人可以向我展示多重性吗?

编辑:对不起,我认为它添加了我的截图: 测试

4

3 回答 3

1

一个受训者一次最多属于一个受训项目

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

在 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
             )

除此之外,使用关联类是正确的方法。

随着时间的推移,受训者可能会参加一个以上的项目。

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

0..1如果该规则和以前的规则被替换为(随着时间的推移)一个受训者最多属于 1 个受训项目,则乘法必须是

一个部分可以运行多个项目。

所以任何数字,多重性1..*必须是0..*或捷径 *

一个项目可以有可能的受训者

may明显很多,所以高数不是 1。

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

所以最后多样性是0..*或捷径 *,而不是1..1

以前的项目如何保留?

这要归功于多样性,0..*而不是0..1受训者与正在进行的项目(如果存在)没有关系。

总结一下:

在此处输入图像描述

对象图示例:

在此处输入图像描述

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


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

于 2020-10-30T08:35:20.470 回答
1

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

“项目”的另一个次要含义是教育,类似于定义为任务类型并且可以由任何学生随时开始/完成的作业。

我的模型指的是第一个(更常见的)概念。

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

在此处输入图像描述

于 2020-10-30T13:17:15.290 回答
-1

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

领域类图

每个Trainee-Project关联都有一个开始日期,但只有Completed Trainee-Project关联有一个结束日期。这是直截了当的,也是我们每天用英语表达的方式。那么为什么不在类图中做呢?然后很容易表达,每个Trainee人最多可以有一个当前项目。通过使其末端派生,我们可以说,关联的类型定义了末端的显示位置 - 在current project或中completed projects

该链接必须随着时间的推移将其 AssociationClass 从 更改current Trainee-Projectcompleted Trainee-Project。如果这对您来说听起来很奇怪,您可能会从编程语言的角度来思考。他们中的大多数不支持动态重新分类。但事实上这就是现实。实习生有一天会成为一名员工。正如一位伟大的诗人曾经说过的那样,他们正在改变的课程(据我所知;-)

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

于 2020-11-09T20:49:53.670 回答