Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
數據庫(ER)模型是一種識別數據庫中實體及其關聯關系的圖表。最終,這些設計會形成一個數據庫關系模型,并配有相應的規則。
設計階段
對于小型應用,我們可以通過理解需求直接決定要建立的關系和屬性。
不過,對于大型項目,我們在設計數據庫時,需要和用戶溝通,了解他們的需求,要先把這些需求用容易理解的方式表達出來,然后再轉換成具體的設計方案,形成一個系統框架。
這個框架會明確說明用戶需要什么數據,以及如何設計數據庫來滿足這些需求。
需求分析:數據庫設計者需要和專業人員、用戶進行充分交流,寫出需求說明。
概念設計:把需求轉換成數據庫的概念模型,這個模型會詳細描述:
數據庫中的實體有哪些
這些實體的特征是什么
實體之間有什么聯系
需要遵守什么規則
通常,我們會畫一個ER圖來表示這些內容,ER 圖主要描述數據和它們之間的關系,不涉及具體的存儲細節。
最后的物理設計階段才會確定如何存儲數據,包括文件組織方式和索引結構的選擇。
在開發數據庫應用前,認真完成這些設計工作非常重要,在此過程中,一個主要部分是決定如何在設計中表示各種類型的「事物」。
比如:人、地方、產品等等,我們使用實體(entity)這個術語來指代任何可以明確識別的個體。
實體-聯系模型
在數據庫設計中,為了管理數據,我們使用實體-聯系模型(Entity- Model,簡稱 ER 模型)的工具。
這種模型主要有三個重要概念:實體集、聯系集、屬性。同時,ER 模型也可以用一種圖形化的方式表示,稱為ER 圖。
什么是實體?
實體是現實世界中可以被區分的一個對象。比如:一個人、一家醫院或一輛救護車都可以是實體,每個實體都可以通過一個唯一的標識符來區分。
實體可以是具體的,比如醫生、病人、建筑物;也可以是抽象的,比如角色、事件、演唱會等。
什么是實體集?
實體集是具有相同性質或屬性的一類實體的集合。一家醫院里的所有醫生是一個實體集。這家醫院的所有救護車也是一個實體集。實體集中每個實體都具有相同類型的屬性。
什么是屬性?
屬性是用來描述實體的特性或性質的。
對于一個醫生實體,它可能有:醫生編號(ID)、姓名(Name)、科室()等屬性。對于一輛救護車實體,它可能有:車牌號(License Plate)、型號(Model)等屬性。
在數據庫中,實體通過一組屬性來表示,屬性是實體集中每個成員所具有的描述性特征。
實體集可能包含的屬性有 ID、名稱等(這里暫時僅考慮簡單屬性)。
而數據庫由多個實體集組成,每個實體集包含任意數量的同類型實體。
在 ER 圖中,實體集用一個矩形表示,矩形分為兩部分:上半部分顯示實體集的名稱,下半部分列出該實體集的所有屬性名稱。
聯系集
實體之間關聯的集合稱為「聯系集」,由多個具有相同類型聯系的實例組成。
它用來表示實體之間的關系,例如「醫生診治病人」或「學生選修課程」,可以分為一對一、一對多或多對多。
聯系是多個實體之間的相互關聯,聯系集是相同類型聯系的集合。
在 ER 圖中,聯系集用菱形表示,菱形通過線條連接到多個不同的實體集。例如,學生和導師之間的關聯可以表示為「指導」聯系,醫生和病人之間的關聯可以表示為「診治」聯系。
在業務模型中,一個聯系表示在實際場景中的關系。例如,一個教師ID為100的老師和一個學生ID為 101的實例共同參與到一個「教學」聯系中。
聯系也可以具有描述性屬性,用來進一步描述聯系的特征。
學生與課程之間的「選修」聯系可以擁有「選修時間」作為其描述性屬性。
在 ER 圖中,聯系的屬性通過一個分割的矩形表示,并用虛線連接到表示聯系的菱形。一個聯系集可以擁有多個描述性屬性。
聯系集通常只顯示在一個位置,避免在多個位置重復出現。
如果實體集需要在多個位置出現,其屬性應只在首次出現時顯示,后續僅顯示實體集名稱,不帶屬性,以減少重復信息,并避免因重復顯示導致屬性不一致的問題。
二元聯系集是涉及兩個實體集的聯系集。數據庫系統中的大多數聯系集屬于二元聯系集。
學生與課程之間的「選修」關系或醫生與病人之間的「診治」關系。
有時,聯系集可能涉及多于兩個實體集。參與聯系集的實體集數量被稱為聯系集的「度」。
復雜屬性
在 ER 模型中使用的屬性可以按照如下的屬性類型來進行描述,主要有三種「簡單和復合」「單值和多值」「派生屬性」等。
簡單和復合屬性
簡單屬性是不可分割的基本屬性,例如學號(Student ID)就是簡單屬性。
復合屬性可以被分解為多個部分,例如地址(Address)可以被劃分為城市(City)、街道(Street)和郵編(Postal Code)。
在設計模型時,使用復合屬性是一種好的選擇,因為它能將相關的屬性整合起來,讓模型更加清晰。
單值和多值屬性
單值屬性是指每個實體的某個屬性只有一個值,例如學生的學號對學生來說就是唯一值,這種屬性被稱為單值屬性。
多值屬性是指某個屬性可能對應一組值,例如教師的電話號碼可能有一個或多個,不同教師的電話號碼數量也可能不同,這種屬性被稱為多值屬性。
派生屬性
派生屬性的值可以通過其他屬性或實體推導出來。
比如說,教師指導的學生人數可以通過統計教師與相關學生實體的數量得出。
或者年齡可以通過出生日期和當前日期計算得出。
派生屬性的值無需存儲,而是在需要時動態計算。
映射基數
一個實體通過某個聯系集可以關聯到其他實體的數量,通常用來描述二元聯系集中的實體關聯關系。
一對一
A 集中的一個實體最多只能與 B 集中的一個實體相關聯(一個人對應唯一的身份證號碼)。
一對多
A 集中的一個實體可以與 B 集中的多個實體相關聯,但 B 集中的一個實體只能與 A 集中的一個實體相關聯(一個老師可以教多個學生,但每個學生只能有一個班主任)。
多對一
A 集中的多個實體可以與 B 集中的同一個實體相關聯,而 B 集中的一個實體只能與 A 集中的一個實體相關聯(多個學生可以被分配到同一個班級,但每個學生只能屬于一個班級)。
多對多
A 集中的一個實體可以與 B 集中的多個實體相關聯,同時 B 集中的一個實體也可以與 A 集中的多個實體相關聯(一個學生可以選修多門課程,每門課程也可以由多個學生選修)。
在 ER 圖的表示法中,我們使用有向線段或非有向線段來表示聯系集之間約束。
一對一
當表示一對一聯系時,我們從兩個實體集之間畫一條有向線段,表示一個實體集中的每個實體最多只能與另一個實體集中的一個實體關聯。
例如,一位教師最多可以指導一名學生,并且一名學生最多只能有一位導師。
一對多
一個實體集到聯系集畫一條有限的線段,表示一個實體集中的一個實體可以與另一個實體集中的多個實體關聯。
多對一
一個實體集到聯系集畫一條有向線段,表示一個實體集中的一個實體可以與另一個實體集中的多個實體相關聯。
多對多
從兩個實體集到聯系集畫一條無向線段,表示兩個實體集中的實體可以相互關聯,且一個實體集中的多個實體可以與另一個實體集中的多個實體關聯。
全部參與
在 ER 圖的表示法中,如果一所大學要求每名學生至少有一位導師,表示這種關系時,可以通過在模型中設置聯系集來描述學生與導師之間的關聯。
學生與導師的關系
每個學生(student實體)必須通過advisor聯系集與至少一位導師相關聯。
在這種情況下,student實體集與advisor聯系集之間的關聯是全體參與,即每個學生都必須有一位導師,表示為全部參與。
教師的參與
對于導師(teacher實體),不是每位教師都需要指導學生,因此在advisor聯系集中的參與是部分參與,即只有一些教師會指導學生。
在 ER 圖中,雙線用于表示一個實體在聯系集中是全部參與的,而單線則表示部分參與。
在概念設計階段,數據庫設計者根據這些需求,把需求轉化成數據庫的概念模型。
這個階段開發出來的模式,就是為企業提供一個詳細的框架。從關系模型的角度來看,概念設計階段的重點是確定數據庫應該包含哪些數據屬性,并且決定如何將這些屬性組織到不同的表里。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。