實體關係圖
實體關係模型(或 ER 模型)描述特定知識領域中相關的事物。基本的 ER 模型由實體類型(對感興趣的事物進行分類)組成,並指定實體(這些實體類型的實例)之間可能存在的關係 維基百科。
請注意,ER 建模的實務人員幾乎總是將實體類型簡稱為實體。例如,CUSTOMER
實體類型將簡稱為 CUSTOMER
實體。這是如此常見,以至於做其他事情是不明智的,但從技術上講,實體是實體類型的抽象實例,這也是 ER 圖所顯示的內容 - 抽象實例以及它們之間的關係。這就是為什麼實體總是使用單數名詞命名的原因。
Mermaid 可以呈現 ER 圖
實體名稱通常會大寫,儘管對此沒有公認的標準,而且在 Mermaid 中也不是必需的。
實體之間的關係用帶有端點標記的線條表示,這些標記表示基數。Mermaid 使用最流行的烏鴉腳符號。烏鴉腳直觀地傳達了它所連接的實體可能存在多個實例。
ER 圖可以用於各種目的,從沒有任何實作細節的抽象邏輯模型,到關聯式資料庫表格的實體模型。在 ER 圖中包含屬性定義來幫助理解實體之目的和意義是很有用的。這些不一定需要是詳盡的;通常一小部分的屬性就足夠了。Mermaid 允許根據它們的類型和名稱來定義它們。
當在 ER 圖中包含屬性時,您必須決定是否將外部索引鍵包含為屬性。這可能取決於您嘗試表示關聯表格結構的緊密程度。如果您的圖表是一個邏輯模型,並非旨在暗示關聯式實作,則最好將它們排除在外,因為關聯關係已經傳達了實體關聯的方式。例如,JSON 資料結構可以使用陣列來實作一對多關係,而不需要外部索引鍵屬性。類似地,物件導向程式語言可能會使用指標或參考來表示集合。即使對於旨在用於關聯式實作的模型,您也可能會認為包含外部索引鍵屬性會重複關係已經描述的資訊,並且不會為實體增加意義。最終,這取決於您的選擇。
語法
實體與關係
Mermaid 的 ER 圖語法與 PlantUML 相容,並擴充了標記關係的功能。每個陳述式由以下幾個部分組成
<first-entity> [<relationship> <second-entity> : <relationship-label>]
其中
first-entity
是實體的名稱。名稱必須以字母字元或底線開頭(從 v10.5.0+ 開始),並且還可以包含數字和連字號。relationship
描述兩個實體相互關聯的方式。請參閱下文。second-entity
是另一個實體的名稱。relationship-label
從第一個實體的角度描述關係。
例如
PROPERTY ||--|{ ROOM : contains
這個陳述式可以理解為一個屬性包含一個或多個房間,而一個房間只屬於一個屬性。您可以看到此處的標籤是從第一個實體的角度來看的:一個屬性包含一個房間,但一個房間不包含一個屬性。從第二個實體的角度來看,通常很容易推斷出等效的標籤。(有些 ER 圖從兩個角度標記關係,但這裡不支持這種做法,而且通常是多餘的)。
只有陳述式的 first-entity
部分是強制性的。這使得顯示沒有關係的實體成為可能,這在圖表的迭代建構過程中很有用。如果指定了陳述式的任何其他部分,則所有部分都是強制性的。
關係語法
每個陳述式的 relationship
部分可以分為三個子元件
- 第一個實體相對於第二個實體的基數
- 關係是否將身分賦予「子」實體
- 第二個實體相對於第一個實體的基數
基數是描述另一個實體的多少個元素可以與所討論的實體相關聯的屬性。在上面的範例中,一個 PROPERTY
可以有一個或多個與其關聯的 ROOM
實例,而一個 ROOM
只能與一個 PROPERTY
關聯。在每個基數標記中都有兩個字元。最外面的字元表示最大值,而最內面的字元表示最小值。下表總結了可能的基數。
值(左) | 值(右) | 意義 |
---|---|---|
|o | o| | 零或一 |
|| | || | 恰好一個 |
}o | o{ | 零或多個(無上限) |
}| | |{ | 一個或多個(無上限) |
別名
值(左) | 值(右) | 別名 |
---|---|---|
一或零 | 一或零 | 零或一 |
零或一 | 零或一 | 零或一 |
一或多個 | 一或多個 | 一或多個 |
一或多個 | 一或多個 | 一或多個 |
多個 (1) | 多個 (1) | 一或多個 |
1+ | 1+ | 一或多個 |
零或多個 | 零或多個 | 零或多個 |
零或多個 | 零或多個 | 零或多個 |
多個 (0) | 多個 (0) | 零或多個 |
0+ | 0+ | 零或多個 |
只有一個 | 只有一個 | 恰好一個 |
1 | 1 | 恰好一個 |
識別
關係可以分為識別或非識別,它們分別使用實線或虛線呈現。當所討論的實體之一不能在沒有另一個實體的情況下獨立存在時,這將相關。例如,一家為人們駕駛汽車提供保險的公司可能需要儲存關於 NAMED-DRIVER
的資料。在對此進行建模時,我們可能會從觀察到一輛 CAR
可以由多個 PERSON
實例駕駛開始,而一個 PERSON
可以駕駛多輛 CAR
- 兩個實體都可以在沒有另一個實體的情況下存在,因此這是一個非識別關係,我們可能會在 Mermaid 中指定為:PERSON }|..|{ CAR : "driver"
。請注意關係中間的兩個點,這將導致在兩個實體之間繪製虛線。但是,當這種多對多關係解析為兩個一對多關係時,我們觀察到 NAMED-DRIVER
不能在沒有 PERSON
和 CAR
的情況下存在 - 關係變為識別關係,並且將使用連字號指定,連字號會轉換為實線
別名
值 | 別名 |
---|---|
至 | 識別 |
選擇性至 | 非識別 |
屬性
可以透過指定實體名稱,然後接一個包含多個 type name
配對的區塊來為實體定義屬性,其中區塊由開頭的 {
和結尾的 }
分隔。屬性將在實體方塊內呈現。例如
type
值必須以字母字元開頭,並且可以包含數字、連字號、底線、括號和方括號。name
值的格式與 type
類似,但可以選擇以星號開頭,以指示屬性是主鍵。除此之外,沒有任何限制,也沒有隱含的有效資料類型集。
實體名稱別名 (v10.5.0+)
可以使用方括號將別名新增至實體。如果提供別名,則會在圖表中顯示別名而不是實體名稱。
屬性鍵和註解
屬性也可以定義 key
或註解。Key 可以是 PK
、FK
或 UK
,分別代表主鍵(Primary Key)、外鍵(Foreign Key)或唯一鍵(Unique Key)。若要在單一屬性上指定多個 key 約束,請用逗號分隔它們(例如:PK, FK
)。comment
使用雙引號在屬性結尾定義。註解本身不能包含雙引號字元。
其他事項
- 如果關係標籤需要超過一個單字,您必須使用雙引號將整個詞組括起來
- 如果關係上完全不需要標籤,您必須使用空的雙引號字串
- (v11.1.0+) 如果您想要關係標籤有多行文字,請在兩行之間使用
<br />
("第一行<br />第二行"
)
樣式設定
組態選項
用於簡單的顏色客製化
名稱 | 用途 |
---|---|
fill | 實體或屬性的背景顏色 |
stroke | 實體或屬性的邊框顏色、關係的線條顏色 |
使用的類別
以下 CSS 類別選擇器可用於更豐富的樣式設定
選擇器 | 描述 |
---|---|
.er.attributeBoxEven | 包含偶數列屬性的方塊 |
.er.attributeBoxOdd | 包含奇數列屬性的方塊 |
.er.entityBox | 代表實體的方塊 |
.er.entityLabel | 實體的標籤 |
.er.relationshipLabel | 關係的標籤 |
.er.relationshipLabelBox | 關係標籤周圍的方塊 |
.er.relationshipLine | 代表實體之間關係的線條 |