簡體   English   中英

UML 圖和具有弱實體的多重性

[英]UML Diagram and Multiplicity with weak entities

嗨,我開始嘗試使用 SQL 和數據庫設計。 我了解事物的 SQL 方面,但嘗試繪制圖表有點令人困惑。

考慮以下業務規則:

  • 學員有姓名、學員 ID 和電子郵件。
  • 一個實習生最多同時屬於一個實習生項目
  • 隨着時間的推移,受訓者可能接受多個項目。
  • 每個項目都有一個名稱和一個項目代碼。 程序由單個部分運行。 一個部分可以運行多個項目。
  • 一個項目可以有很多受訓者

如果實習生一次只能做一個項目,但業務規則規定隨着時間的推移,他們可能會做多個項目。 以前的項目將如何保留?

有人可以向我展示多樣性嗎?

編輯:抱歉,我以為它添加了我的屏幕截圖:測試

一個實習生最多同時屬於一個實習生項目

這可以通過一個約束來表明,對於給定的受訓者來說,項目的日期永遠不會重疊。

在 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..*或快捷方式*

如果該規則和之前的規則被(隨着時間的推移)最多屬於 1 個受訓項目的實習生取代,則乘數必須為0..1

一個部分可以運行多個項目。

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

一個項目可以有可能受訓者

may顯然很多,所以高數不是 1。

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

所以最后多重性是0..*或快捷方式* ,而不是1..1

以前的項目將如何保留?

他們多虧了多重性0..*而不是0..1 ,如果存在的話,受訓者不僅與正在進行的項目有關系

總結一下:

在此處輸入圖片說明

對象圖示例:

在此處輸入圖片說明

你可以檢查所有的規則都被遵守了。


在某些情況下,您的屬性名稱包含類的名稱,例如projectName e 和traineeId ,這是無用的,我建議您刪除屬性名稱中的類名稱。

“項目”一詞含糊不清。 標准含義是一個項目由具有不同項目參與者執行的各種活動/任務的工作包組成。 當然,這樣的項目有開始時間和結束時間。

“項目”的另一個次要含義是教育,類似於定義為任務類型並且可以由任何學生隨時開始/完成的作業。

我的模型指的是第一個(更常見的)概念。

用於表達該“A生至多屬於1名受訓者項目在時間”的約束具有附接至一個不變(盒)的形式來表示Trainee類,如下所示:

在此處輸入圖片說明

一個沒有 ocl 的解決方案,可以直觀地描述所需的語義:

領域類圖

每個Trainee-Project關聯都有一個開始日期,但只有Completed Trainee-Project關聯才有結束日期。 這是直截了當的,將是我們每天用英語表達的方式。 那么為什么不在類圖中這樣做呢? 然后很容易表達,每個Trainee最多可以有一個當前項目。 通過派生其端點,我們可以說,關聯的類型定義了端點的顯示位置 - 在current projectcompleted projects

隨着時間的推移,鏈接必須將其 AssociationClass 從current Trainee-Project更改為completed Trainee-Project 如果這對您來說聽起來很奇怪,您可能會從編程語言的角度思考。 它們中的大多數不支持動態重分類。 但事實上這就是現實。 實習生有一天會成為一名雇員。 他們正在改變的課程,正如一位偉大的詩人曾經說過的那樣(據我所知;-)

你可能會說,SQL 不支持這個。 嗯,是的,但它也不支持 n:m 關系。 因此,無論如何您都需要將域模型映射到 SQL。 因此,讓你的領域模型盡可能接近你的需求,稍后再考慮映射到 SQL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM