優化實體-關係圖(ERD)以實現有效的資料庫設計
問題描述:ER建模 – 汽車租賃公司系統
一家汽車租賃公司需要建立一個資料庫來管理其業務運作。該公司擁有一支大型車隊,這些車輛會租給客戶進行短期或長期租賃。公司於不同地點設有多個分支機構,每個分支機構都有自己的車隊。
公司希望追蹤可供租賃的車輛、租賃車輛的客戶、租賃期間以及每次租賃的費用。他們還希望追蹤每輛車的保養計畫以及已執行的保養活動。

公司對其資料庫有以下需求:
- 車輛可租給客戶一段特定的租賃期間。
- 一位客戶可以租用多輛車,而一輛車也可以被多位客戶租用。
- 每輛車的租賃費用應根據租賃期間以及任何額外費用(如保險或燃油費用)來計算。
- 公司希望追蹤每輛車的保養計畫以及已執行的保養活動。
- 公司希望能夠查看車輛使用情況的報表,包括租賃次數、租賃期間以及產生的收入。
- 公司希望能夠查看其車輛所執行保養活動的報表,包括保養類型、執行日期以及成本。
- 公司希望追蹤租賃其車輛的客戶,包括其個人資訊,如姓名、地址、電話號碼和電子郵件地址。
- 公司希望能夠查看其客戶的報表,包括租賃次數、租賃期間以及每位客戶產生的收入。
為滿足這些需求,可以建立實體-關係(ER)圖來模擬汽車租賃系統。該圖將包含車輛、客戶、租賃和保養等實體,以及租賃、客戶租賃和車輛保養等關係。
建立資料庫ER圖的逐步指南
以下是建立資料庫ER圖的逐步指南:
- 識別實體:首先識別資料庫中將包含的不同實體。這些實體可以是人、地點、事物或與資料庫領域相關的概念。例如,在汽車租賃系統中,實體可能包括車輛、客戶、租賃和保養。
- 確定屬性:接下來,確定每個實體的屬性。屬性是描述實體的特徵或性質。例如,車輛實體的屬性可能包括製造商、型號、年份和車牌號碼。
- 識別關係:在識別實體及其屬性後,確定實體之間的關係。關係是實體之間的連接或關聯。例如,車輛與租賃實體之間的關係是:一輛車可以在特定租賃期間被租出。
- 確定基數:基數描述了一個實體的實例可以與另一個實體的實例關聯的數量。例如,車輛與租賃實體之間的基數可能是「一對多」,表示一輛車可以租給多位客戶。
- 確定關係的度數:關係的度數指的是參與關係的實體數量。例如,車輛與租賃實體之間的關係是二元關係,表示僅涉及兩個實體。
- 建立初步圖示:利用前幾個步驟收集的資訊來建立初步的ER圖。該圖應包含實體、屬性、關係、基數以及關係的度數。
- 精煉圖示: 通過審查準確性、完整性和一致性來優化實體關係圖。如有必要,進行調整或修改,以確保圖表準確反映資料庫的需求。
- 新增約束: 在圖表中新增任何有助於確保資料完整性和一致性的約束。約束是限制可輸入資料庫資料的規則或條件。例如,約束可以是車輛實體必須具有有效的車牌號碼。
- 定稿圖表: 在實體關係圖經過優化且已加入約束後,定稿圖表。最終圖表應準確反映資料庫及其需求。
- 產生資料庫: 使用定稿後的實體關係圖,產生資料庫結構。資料庫結構定義了資料庫的結構,包括表格、欄位以及它們之間的關係。
理解概念、邏輯與物理資料模型之間的差異
從問題描述建立概念實體關係圖
實體關係圖包含四個實體:車輛、客戶、租賃與維修。每個實體都有其屬性,例如車輛實體的車輛編號、型號、製造商、年份、每日租金、燃料類型、是否可租用;客戶實體的名稱、姓氏、電子郵件、電話號碼與地址;租賃實體的起始日期、結束日期、租賃費用、保險費用、燃油費用;以及維修實體的類型、描述、費用與維修日期。
實體關係圖還顯示實體之間的關係,包括車輛與租賃實體之間的租賃關係、租賃與客戶實體之間的客戶租賃關係,以及車輛與維修實體之間的車輛維修關係。

將概念實體關係圖優化為邏輯實體關係圖
邏輯實體關係圖採用更正式且詳細的符號,強調表格、欄位、鍵與關係。特別是,會標示欄位的資料類型。此外,還為關係加上標籤(「租用」、「被租用」與「需要」),以表明每種關係的性質。

將邏輯實體關係圖優化為物理實體關係圖
物理實體關係圖是一種「資料庫結構圖」,提供足夠的細節以在特定DBMS中實現資料庫。實體與欄位的命名已進行修正,以:
- 支援DBMS特定語法。
- 確保使用非保留字(例如:order → purchase_order,desc → description)
- 符合組織特定的命名規範
維修實體中的欄位「desc」已更名為「description」。

資料庫結構產生:將實體關係圖轉換為物理結構
資料庫結構是一種資料庫結構的視覺化呈現,定義了關係式資料庫管理系統中資料的組織方式。該結構是根據用於模擬系統中不同實體之間關係的實體關係圖(ERD)所建立的。
在這種情況下,ERD首先被細化為一個邏輯ERD,用於定義Cars、Customers、Rentals和Maintenance等實體及其各自屬性之間的關係。邏輯ERD有助於建立實體之間的關係和基數。
在細化邏輯ERD之後,下一步是生成一個物理ERD,用於定義實際的資料庫架構,包含所有必要的資料類型、主鍵和外鍵以及任何約束條件。物理ERD反映了邏輯ERD,但對資料在資料庫中如何存儲提供了更多細節。
根據物理ERD,撰寫了SQL程式碼,以建立具有適當表格、欄位以及它們之間關係的資料庫架構。架構中的每個表格代表系統中的一個實體,欄位則代表該實體的屬性。主鍵被定義為唯一識別表格中的每筆記錄,而外鍵則用於建立表格之間的關係。
CREATE TABLE Car (
car_id INT PRIMARY KEY,
model VARCHAR(255),
make VARCHAR(255),
year INT,
daily_rate DECIMAL(10, 2),
fuel_type VARCHAR(255),
is_available BOOLEAN
);CREATE TABLE Customer (
customer_id INT PRIMARY KEY,
first_name VARCHAR(255),
last_name VARCHAR(255),
email VARCHAR(255),
phone_number VARCHAR(255),
address VARCHAR(255)
);CREATE TABLE Rental (
rental_id INT PRIMARY KEY,
start_date DATE,
end_date DATE,
rental_rate DECIMAL(10, 2),
insurance_charge DECIMAL(10, 2),
fuel_charge DECIMAL(10, 2),
car_id INT,
customer_id INT,
FOREIGN KEY (car_id) REFERENCES Car(car_id),
外鍵 (customer_id) 參照 Customer(customer_id)
);建立資料表 Maintenance (
maintenance_id 整數 主鍵,
type 變長字串(255),
description 文字,
cost 十進位數(10, 2),
maintenance_date 日期,
car_id 整數,
外鍵 (car_id) 參照 Car(car_id)
);
摘要
本文討論了如何透過優化實體關係圖(ERD)來產生有效的資料庫結構。ERD 會從概念層級逐步優化至邏輯層級,再進一步轉換為物理層級。邏輯 ERD 建立了實體之間的關係與關聯性,而物理 ERD 則定義了實際的資料庫結構,包含所有必要的資料型態、主鍵與外鍵,以及限制條件。
接著根據物理 ERD 寫出 SQL 程式碼,以建立具備適當資料表、欄位與關係的資料庫結構。本文強調優化 ERD 對於有效資料庫設計的重要性,並提供從 ERD 產生資料庫結構過程的深入見解。











