數(shù)據(jù)庫設計:實體關系圖
一個良好的設計對于數(shù)據(jù)庫系統(tǒng)至關重要,它可以減少數(shù)據(jù)冗余,確保數(shù)據(jù)的一致性和完整性,同時使得數(shù)據(jù)庫易于維護和擴展。
實體關系圖(Entity-Relationship Diagram、ERD)是一種用于數(shù)據(jù)庫設計的結構圖,它描述了數(shù)據(jù)庫中的實體以及它們之間的關系。從結構上來說,數(shù)據(jù)庫的 ERD 主要包括實體、屬性以及關系三個部分。
實體
實體代表了一種對象或者概念。例如,員工、部門和職位都可以被稱為實體。實體包含一個或多個屬性,實體在數(shù)據(jù)庫中對應的就是關系表。下圖是一個員工實體員工實體(employee)。
屬性
屬性表示實體的某種特性,例如員工擁有姓名、性別、工資等屬性。屬性在數(shù)據(jù)庫中對應的就是表中的字段,字段擁有一個指定的名稱和數(shù)據(jù)類型。下圖顯示了員工實體的各種屬性。
其中,員工編號(emp_id)屬性可用來唯一標識每一位員工,被稱為主鍵(Primary Key)。主鍵可以是單個字段,也可以由多個字段組成。
關系
關系用于表示兩個實體之間的聯(lián)系,三種常見的關系類型包括一對一、一對多以及多對多的關系。
例如,一夫一妻制是一種典型的一對一的關系。一個員工只能屬于一個部門,一個部門可以擁有多個員工,因此部門和員工之間是一對多的關系。一個學生可以選修多門課程,一門課程可以被多個學生選修,因此學生和課程之間是多對多的關系。
ERD 建模
數(shù)據(jù)庫的 ERD 模型可以按照業(yè)務抽象層次分為三種類型:
- 概念 ERD。概念數(shù)據(jù)模型用于描述系統(tǒng)中存在的業(yè)務對象以及它們之間的聯(lián)系,一般由業(yè)務分析人員使用。在概念 ERD 中使用長方形表示實體,使用橢圓形表示屬性,使用菱形表示聯(lián)系。
- 邏輯 ERD。邏輯數(shù)據(jù)模型用于對概念數(shù)據(jù)模型進一步的分解和細化,將其轉換為關系模型(表和字段)。同時,邏輯 ERD 還會引入規(guī)范化過程,對關系模式進行優(yōu)化。
- 物理 ERD。物理數(shù)據(jù)模型是針對特定數(shù)據(jù)庫的設計描述。物理 ERD 需要為每個字段指定數(shù)據(jù)類型、長度、可否為空等屬性,同時為表增加主鍵、外鍵以及索引等。
許多常用的數(shù)據(jù)庫軟件都提供了 ERD 建模功能,例如 Visual Paradigm Community Edition、MySQL Workbench、Oracle SQL Developer、SQL Server Management Studio 等免費軟件,以及 Toad Data Modeler、PowerDesigner、Navicat Data Modeler 等商業(yè)軟件。
我們以 MySQL Workbench 為例簡單介紹如何創(chuàng)建一個用于 MySQL 數(shù)據(jù)庫的物理 ERD。首先點擊軟件主界面的“File”->“New Model”菜單,然后在打開的模型界面中點擊“Add Diagram”按鈕,新建一個 ERD 模型。
接下來我們在 ERD 模型中通過拖曳加編輯的方式創(chuàng)建 department、job、employee 以及 job_history 4 個表,同時通過連線建立它們之間的關系。其中 department 和 employee 之間是一對多的關系,job 和 employee 之間也是一對多的關系,job_history 則和其他 3 個表之間存在外鍵關聯(lián)。
最終,我們創(chuàng)建的 ERD 如下圖所示。
最后,我們可以點擊“File”->“Export”菜單,將 ERD 模型導出為 SQL 腳本或者圖片,也可以點擊“Database”->“Forward Engineer”菜單,連接 MySQL 數(shù)據(jù)庫來創(chuàng)建物理表和索引。
另外,我們還可以點擊“Database”->“Reverse Engineer”菜單,從已有的 MySQL 數(shù)據(jù)庫中反向生成物理 ERD 模型。