對實體-關係資料模型(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,並將其與每位作者關聯起來。

關係屬性

屬性不僅限於實體。關係也可以有屬性。

假設我們需要對圖書館進行建模。除了書籍和作者實體之外,現在我們引入了讀者實體,表示借書閱讀的人。我們在他們借書時記錄他們的姓名和身份證號碼:

沒有屬性的關係

但我們仍然缺少一些信息。我們需要知道借閱書籍的日期,以及他們歸還書籍的日期,以便在圖書館中存儲有關特定書籍的所有歷史記錄信息。此信息不屬於書籍或讀者實體,而屬於關係:

關係屬性

弱實體

我們上面已經談到了主鍵,以及它們如何幫助唯一識別一個實體。

某些實體依賴於其他實體的存在,並被稱為弱實體

假設我們需要為一家線上商店建模訂單。

對於每個訂單,我們將存儲訂單ID(從1開始,隨時間增加),訂單下單的日期和時間,以及客戶的信息,以便知道要向誰帳單和送貨。

然後我們還需要知道他們訂購了什麼。我們創建一個弱實體“訂購項目”,表示結帳時購物車中的每個項目。

弱實體

這個實體將存儲結帳時的商品價格(因此,當我們更改特價商品價格時,將不會影響已經下單的訂單),訂購的商品數量以及所選的選項。假設我們銷售T恤,因此我們需要存儲訂購的T恤的顏色和尺寸。

它是一個弱實體,因為沒有訂單實體,訂購項目實體無法存在。

循環關係

一個實體可以與自己具有循環關係。假設我們有一個人實體。我們可以通過以下方式對父子關係進行建模:

循環關係

一個人可以擁有從0到n個孩子,一個孩子有兩個父親(考慮最簡單的情境)。

ISA關係

ISA代表IS-A,它是在ER模型中建模概括的一種方法。

我們使用它將類似的實體分組在一個共同範疇下。例如,在圖書和圖書館的例子中,作者和讀者可以使用人實體進行泛化。

他們都有一個名字,所以我們將名字提取到人實體中,並在相應的實體中管理作為作者或讀者的特殊性:

ISA關係

非二元關係

並非每個關係都是嚴格的二元關係。讓我們舉個課程的例子。

一堂課在今天的學校教室上午10點舉行,由一位教師與一個班級關於物理學講述。

因此,一堂課在一天中的特定時間進行,涉及一個科目、一位教師、一個班級和一個教室。

我們可以如下方式進行建模:

非二元關係