UML 图和弱实体的多重性
UML Diagram and Multiplicity with weak entities
您好,我开始尝试 SQL 和数据库设计。
我了解事物的 SQL 方面,但尝试绘制图表有点令人困惑。
考虑这些业务规则:
- 学员有姓名、学员 ID 和电子邮件。
- 一个Trainee一次最多属于1个Trainee项目
- 随着时间的推移,受训者可能会承担多个项目。
- 每个项目都有一个名称和一个项目代码。一个程序由一个部分 运行 组成。一个部分可以
运行 不止一个项目。
- 一个项目可以有很多学员
如果一名实习生一次只能做 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 project
或 completed projects
.
中
link 必须随时间将其 AssociationClass 从 current Trainee-Project
更改为 completed Trainee-Project
。如果这对您来说听起来很奇怪,您可能会从编程语言的角度来思考。它们中的大多数不支持动态重新class化。但事实上这就是现实。实习生有一天会成为一名雇员。 classes 它们是 a-changin',正如一位伟大的诗人曾经说过的那样(据我所知 ;-)
你可能会说,SQL不支持这个。嗯,是的,但它也不支持 n:m 关系。所以无论如何你都需要将你的域模型映射到 SQL 。所以,让你的领域模型尽量贴近你的需求,以后再考虑映射到SQL。
您好,我开始尝试 SQL 和数据库设计。 我了解事物的 SQL 方面,但尝试绘制图表有点令人困惑。
考虑这些业务规则:
- 学员有姓名、学员 ID 和电子邮件。
- 一个Trainee一次最多属于1个Trainee项目
- 随着时间的推移,受训者可能会承担多个项目。
- 每个项目都有一个名称和一个项目代码。一个程序由一个部分 运行 组成。一个部分可以 运行 不止一个项目。
- 一个项目可以有很多学员
如果一名实习生一次只能做 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 project
或 completed projects
.
link 必须随时间将其 AssociationClass 从 current Trainee-Project
更改为 completed Trainee-Project
。如果这对您来说听起来很奇怪,您可能会从编程语言的角度来思考。它们中的大多数不支持动态重新class化。但事实上这就是现实。实习生有一天会成为一名雇员。 classes 它们是 a-changin',正如一位伟大的诗人曾经说过的那样(据我所知 ;-)
你可能会说,SQL不支持这个。嗯,是的,但它也不支持 n:m 关系。所以无论如何你都需要将你的域模型映射到 SQL 。所以,让你的领域模型尽量贴近你的需求,以后再考虑映射到SQL。