對實體-關係資料模型(Entity-Relationship Data Model),也稱為ER模型,提供一個簡單而全面的概述。ER模型是您可以用來理解資料的各種[資料模型](/data-models/)之一。
特別是,它是一個概念性資料模型,因為它沒有與任何特定實施相關聯。這是邏輯資料模型留下的任務。
ER資料模型非常通用且高層次的,可以通過多種完全不同類型的資料庫來實現。
它很棒,因為您只需考慮資料及其組織方式,而不需考慮實現細節。在這樣做的過程中,您將被迫以不同於以往的方式分析問題。
我發現ER圖對於幫助您分析涉及資料的情境非常有幫助。
ER模型提供了一種表示所有需要建模的資料、不同類型資料之間的關係及其相關資訊的圖形表示法。
ER模型由兩個元素組成:
- 實體(entities)
- 關係(relations)
實體是一些具有共同特性的資料類型,例如項目或人。
關係是實體之間的關係。
讓我給您舉個例子,我們談談書籍及其作者。我們有兩個實體:
- 書籍(book)
- 作者(author)
一本特定的書籍是書籍實體的一個實例。
由於我們有兩個實體,所以我們之間有兩個關係。一個是單本書和作者實體之間的關係。另一個是一位作者和書籍實體之間的關係。如果我們考慮一下,我們有:
- 一本書有一位作者
- 一位作者可以撰寫多本不同的書籍
實體的視覺表示法
有了這個簡單的例子,我們可以開始介紹將幫助我們創建我們場景的ER資料模型的視覺表示法。
註:有許多不同的繪製ER圖的方式。我將使用我認為更具視覺效果且更有意義的一種方式。
將實體表示為矩形,其中包含一些文本以識別它們:
關係的視覺表示法
表示實體之間的關係,在其最基本形式上,使用連接兩個實體的線條以及在其中標識關係類型的菱形來表示:
請注意,我沒有創建“書籍有作者”和“作者寫書籍”兩個關係。我建立了一個將書籍和作者之間的關係建立為“撰寫”之間的單一關係。
基數
一旦我們建立了關係,我們現在必須指示涉及的數量。目前,我們有很多問題:
- 一本書可以由多少位作者撰寫?
- 一位作者可以撰寫多本書嗎?
- 一位作者需要至少撰寫一本書才能被稱為作者嗎?
- 一本書可以由多位作者撰寫嗎?
- 一本書是否可以沒有至少一位作者?
這些都是非常好的問題,對於這個案例,我認為答案是相當明顯的。當答案不明顯時,您可以考慮問題並添加自己的限制。
在圖表上視覺表示基數有很多種方式。有些人喜歡在連接到實體的線條上更改線條的形狀。
我更喜歡使用數字,這樣事情更清晰明確:
上面的數字意味著:一本書可以由1位或多位作者撰寫。n
表示任意數量的元素。
而一位作者可以撰寫從0本書(或許他/她現在正在撰寫一本)到無限多本書。
第一種情況被稱為零對多關係。第二種是一對多關係。
我們還可以有:
- 一對一關係
- 多對多關係
- 零對一關係
屬性
每個實體都可以有一個或多個屬性。
假設我們將上述關係應用於一家書店。每位作者都有姓名、生物和網站URL。
每本書都有標題、出版商、出版年份和ISBN。如果我們希望,出版商也可以是一個實體,但我們也可以將其定義為書的屬性。
以下是我們如何表示上述信息的方式:
識別屬性
實體必須使用唯一鍵進行識別。書籍實體可以通過ISBN屬性進行唯一識別。每本書都有單一的ISBN(假設我們不區分圖書的副本,而是個別表示一本書)。
我們通過在下方緻片下標識主鍵屬性:
另一方面,作者暫時沒有唯一識別符。兩位作者可能具有相同的名字。
因此,我們必須添加一個唯一鍵屬性。例如,id
屬性:
識別屬性可以跨越多個屬性。
例如,護照ID和作者國家可以唯一識別一個人,並取代我們添加的id
屬性:
選擇哪個呢?這取決於您的應用程式中哪個更具意義。如果我們正在建模一家書店,則不能指望所有書籍作者的國家和護照ID。因此,我們將使用隨機選擇的id
,並將其與每位作者關聯起來。
關係屬性
屬性不僅限於實體。關係也可以有屬性。
假設我們需要對圖書館進行建模。除了書籍和作者實體之外,現在我們引入了讀者實體,表示借書閱讀的人。我們在他們借書時記錄他們的姓名和身份證號碼:
但我們仍然缺少一些信息。我們需要知道借閱書籍的日期,以及他們歸還書籍的日期,以便在圖書館中存儲有關特定書籍的所有歷史記錄信息。此信息不屬於書籍或讀者實體,而屬於關係:
弱實體
我們上面已經談到了主鍵,以及它們如何幫助唯一識別一個實體。
某些實體依賴於其他實體的存在,並被稱為弱實體。
假設我們需要為一家線上商店建模訂單。
對於每個訂單,我們將存儲訂單ID(從1開始,隨時間增加),訂單下單的日期和時間,以及客戶的信息,以便知道要向誰帳單和送貨。
然後我們還需要知道他們訂購了什麼。我們創建一個弱實體“訂購項目”,表示結帳時購物車中的每個項目。
這個實體將存儲結帳時的商品價格(因此,當我們更改特價商品價格時,將不會影響已經下單的訂單),訂購的商品數量以及所選的選項。假設我們銷售T恤,因此我們需要存儲訂購的T恤的顏色和尺寸。
它是一個弱實體,因為沒有訂單實體,訂購項目實體無法存在。
循環關係
一個實體可以與自己具有循環關係。假設我們有一個人實體。我們可以通過以下方式對父子關係進行建模:
一個人可以擁有從0到n個孩子,一個孩子有兩個父親(考慮最簡單的情境)。
ISA關係
ISA代表IS-A,它是在ER模型中建模概括的一種方法。
我們使用它將類似的實體分組在一個共同範疇下。例如,在圖書和圖書館的例子中,作者和讀者可以使用人實體進行泛化。
他們都有一個名字,所以我們將名字提取到人實體中,並在相應的實體中管理作為作者或讀者的特殊性:
非二元關係
並非每個關係都是嚴格的二元關係。讓我們舉個課程的例子。
一堂課在今天的學校教室上午10點舉行,由一位教師與一個班級關於物理學講述。
因此,一堂課在一天中的特定時間進行,涉及一個科目、一位教師、一個班級和一個教室。
我們可以如下方式進行建模: