Entity-Relationship Diagram (ERD)
1. ERD là gì?
Entity-Relationship Diagram (ERD) là một sơ đồ trực quan thể hiện:
- Entities (thực thể): Đối tượng cần lưu trữ
- Attributes (thuộc tính): Thông tin của entity
- Relationships (quan hệ): Mối liên kết giữa entities
Tại sao cần ERD?
| Benefit | Description |
|---|---|
| 📝 Documentation | Tài liệu hóa cấu trúc database |
| 🤝 Communication | Giao tiếp với stakeholders |
| 🔍 Analysis | Phát hiện vấn đề sớm |
| 🏗️ Blueprint | Bản thiết kế để implement |
| ✅ Validation | Verify với business requirements |
2. Các thành phần của ERD
ERD Components
ERD
Entity
Strong Entity
Weak Entity
Attribute
Simple
Composite
Derived
Multivalued
Relationship
1:1
1:N
M:N
2.1 Entity (Thực thể)
Entity = Đối tượng mà chúng ta muốn lưu trữ thông tin.
Text
1Ví dụ trong AdventureWorks:2- Customer (Khách hàng)3- Product (Sản phẩm)4- Order (Đơn hàng)5- Employee (Nhân viên)Strong Entity vs Weak Entity
| Type | Description | Example |
|---|---|---|
| Strong Entity | Tồn tại độc lập, có PK riêng | Customer, Product |
| Weak Entity | Phụ thuộc vào entity khác | OrderDetail (phụ thuộc Order) |
2.2 Attribute (Thuộc tính)
Attribute = Thông tin mô tả entity.
Text
1Customer Entity:2- CustomerID (Primary Key)3- FirstName4- LastName5- Email6- Phone7- DateOfBirthCác loại Attribute
| Type | Description | Example |
|---|---|---|
| Simple | Không thể chia nhỏ | FirstName, Age |
| Composite | Có thể chia nhỏ | Address (Street, City, ZIP) |
| Derived | Tính từ attribute khác | Age (từ DateOfBirth) |
| Multivalued | Nhiều giá trị | PhoneNumbers |
| Key | Định danh duy nhất | CustomerID |
2.3 Relationship (Quan hệ)
Relationship = Mối liên kết giữa các entities.
3. Cardinality (Bản số)
Cardinality xác định số lượng instances trong một relationship.
3.1 One-to-One (1:1)
One-to-One Relationship
SQL Implementation:
SQL
1-- Option 1: FK in either table2CREATE TABLE Employee (3 EmployeeID INT PRIMARY KEY,4 Name NVARCHAR(100),5 OfficeID INT UNIQUE, -- UNIQUE ensures 1:16 FOREIGN KEY (OfficeID) REFERENCES Office(OfficeID)7);89-- Option 2: Same PK in both tables10CREATE TABLE EmployeeDetails (11 EmployeeID INT PRIMARY KEY, -- Same as Employee.EmployeeID12 SSN VARCHAR(20),13 FOREIGN KEY (EmployeeID) REFERENCES Employee(EmployeeID)14);3.2 One-to-Many (1:N)
One-to-Many Relationship
SQL Implementation:
SQL
1-- FK ở phía "Many" (Order)2CREATE TABLE Orders (3 OrderID INT PRIMARY KEY,4 CustomerID INT,5 OrderDate DATE,6 FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID)7);AdventureWorks Example:
SQL
1-- Xem relationship Customer -> SalesOrderHeader2SELECT 3 c.CustomerID,4 COUNT(soh.SalesOrderID) AS OrderCount5FROM Sales.Customer c6LEFT JOIN Sales.SalesOrderHeader soh 7 ON c.CustomerID = soh.CustomerID8GROUP BY c.CustomerID9ORDER BY OrderCount DESC;3.3 Many-to-Many (M:N)
Many-to-Many Relationship
SQL Implementation:
SQL
1-- Cần Junction Table (Bridge Table)2CREATE TABLE Student (3 StudentID INT PRIMARY KEY,4 Name NVARCHAR(100)5);67CREATE TABLE Course (8 CourseID INT PRIMARY KEY,9 CourseName NVARCHAR(100)10);1112-- Junction Table13CREATE TABLE Enrollment (14 StudentID INT,15 CourseID INT,16 EnrollDate DATE,17 Grade CHAR(2),18 PRIMARY KEY (StudentID, CourseID),19 FOREIGN KEY (StudentID) REFERENCES Student(StudentID),20 FOREIGN KEY (CourseID) REFERENCES Course(CourseID)21);AdventureWorks Example:
SQL
1-- Product <-> SalesOrder là M:N thông qua SalesOrderDetail2SELECT 3 p.ProductID,4 p.Name AS ProductName,5 COUNT(DISTINCT sod.SalesOrderID) AS OrderCount6FROM Production.Product p7JOIN Sales.SalesOrderDetail sod ON p.ProductID = sod.ProductID8GROUP BY p.ProductID, p.Name9ORDER BY OrderCount DESC;4. ERD Notation Styles
4.1 Chen Notation (Original)
Text
1┌─────────┐ ┌─────────┐2 │Customer │───<Places>────────│ Order │3 └─────────┘ 1 N └─────────┘4 │5 ┌────┴────┐6 │CustomerID│ (Key attribute - underlined)7 │Name │8 │Email │9 └──────────┘4.2 Crow's Foot Notation (Phổ biến nhất)
Text
1┌─────────────┐ ┌─────────────┐2 │ Customer │ │ Order │3 ├─────────────┤ ├─────────────┤4 │ CustomerID │──────┤├──────│ OrderID │5 │ Name │ │ │ CustomerID │6 │ Email │ │ │ OrderDate │7 └─────────────┘ │ └─────────────┘8 │9 ──┤├── One and only one10 ──┤<── One or many11 ──○┤── Zero or one12 ──○<── Zero or many4.3 UML Class Diagram Style
Text
1┌─────────────────┐ ┌─────────────────┐2 │ Customer │ │ Order │3 ├─────────────────┤ ├─────────────────┤4 │ +CustomerID: PK │ 1 * │ +OrderID: PK │5 │ +Name: string ├─────────┤ +CustomerID: FK │6 │ +Email: string │ │ +OrderDate: date│7 └─────────────────┘ └─────────────────┘5. Vẽ ERD cho AdventureWorks
5.1 Sales Module ERD
AdventureWorks Sales Module
5.2 Query để hiểu ERD
SQL
1-- Xem structure của Sales module2SELECT 3 t.name AS TableName,4 c.name AS ColumnName,5 ty.name AS DataType,6 c.is_nullable,7 CASE WHEN pk.column_id IS NOT NULL THEN 'PK' ELSE '' END AS IsPK,8 CASE WHEN fk.parent_column_id IS NOT NULL THEN 'FK' ELSE '' END AS IsFK9FROM sys.tables t10JOIN sys.columns c ON t.object_id = c.object_id11JOIN sys.types ty ON c.user_type_id = ty.user_type_id12LEFT JOIN (13 SELECT ic.object_id, ic.column_id14 FROM sys.index_columns ic15 JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id16 WHERE i.is_primary_key = 117) pk ON t.object_id = pk.object_id AND c.column_id = pk.column_id18LEFT JOIN sys.foreign_key_columns fk ON t.object_id = fk.parent_object_id AND c.column_id = fk.parent_column_id19WHERE SCHEMA_NAME(t.schema_id) = 'Sales'20ORDER BY t.name, c.column_id;6. Best Practices khi vẽ ERD
DO ✅
markdown
11. **Đặt tên rõ ràng**2 - Entity: Danh từ số ít (Customer, không phải Customers)3 - Relationship: Động từ (Places, Contains, Manages)4 52. **Xác định PK cho mọi entity**6 - Mỗi entity PHẢI có Primary Key7 - PK nên là single column khi có thể8 93. **Định nghĩa cardinality rõ ràng**10 - 1:1, 1:N, hay M:N?11 - Optional hay Mandatory?12 134. **Giữ ERD đơn giản**14 - Chia thành nhiều diagrams nếu cần15 - Focus vào một module/area16 175. **Review với stakeholders**18 - Verify business rules19 - Ensure completenessDON'T ❌
markdown
11. **Đừng vẽ quá chi tiết ban đầu**2 - Bắt đầu từ high-level3 - Thêm chi tiết dần dần4 52. **Đừng bỏ qua M:N relationships**6 - Luôn cần junction table7 - Có thể có attributes riêng8 93. **Đừng quên derived attributes**10 - Age từ DateOfBirth11 - TotalAmount từ calculations12 134. **Đừng design trong isolation**14 - Involve business users15 - Validate assumptions7. Công cụ vẽ ERD
7.1 SQL Server Management Studio
SQL
1-- 1. Trong SSMS, right-click database2-- 2. Chọn "Database Diagrams"3-- 3. Create New Diagram4-- 4. Add tables và SSMS tự vẽ relationships7.2 Online Tools
| Tool | URL | Features |
|---|---|---|
| dbdiagram.io | dbdiagram.io | Simple, export SQL |
| Lucidchart | lucidchart.com | Collaborative |
| draw.io | draw.io | Free, flexible |
| ERDPlus | erdplus.com | Academic |
7.3 dbdiagram.io Syntax
Text
1// Paste vào dbdiagram.io2Table Customer {3 CustomerID int [pk]4 FirstName varchar5 LastName varchar6 Email varchar7}8 9Table Order {10 OrderID int [pk]11 CustomerID int [ref: > Customer.CustomerID]12 OrderDate date13 TotalAmount decimal14}15 16Table OrderDetail {17 OrderID int [pk, ref: > Order.OrderID]18 ProductID int [pk, ref: > Product.ProductID]19 Quantity int20 UnitPrice decimal21}22 23Table Product {24 ProductID int [pk]25 ProductName varchar26 CategoryID int27 UnitPrice decimal28}8. Hands-on Exercise
Exercise: Vẽ ERD cho Library System
Requirements:
- Thư viện cho mượn sách
- Có thông tin books, members, borrowings
- 1 member có thể mượn nhiều books
- 1 book có thể được mượn nhiều lần (không cùng lúc)
- Books thuộc về categories
- Track ngày mượn, ngày trả, trạng thái
Task:
- Xác định Entities
- Xác định Attributes cho mỗi entity
- Xác định Relationships và Cardinality
- Vẽ ERD (dùng công cụ bất kỳ)
- Viết SQL CREATE TABLE statements
Solution Outline
Library System ERD
Tiếp theo
Bài tiếp theo: Normalization - học cách chuẩn hóa database để loại bỏ redundancy và đảm bảo data integrity!
