MinAI - Về trang chủ
Lý thuyết
2/1335 phút
Đang tải...

Entity-Relationship Diagram (ERD)

Học cách mô hình hóa dữ liệu với ERD - công cụ quan trọng nhất trong database design

0

🎯 Mục tiêu bài học

TB5 min

Sau bài học này, bạn sẽ:

  • ✅ Hiểu ERD là gì và tại sao cần ERD
  • ✅ Nắm được các thành phần: Entity, Attribute, Relationship
  • ✅ Phân biệt Cardinality: 1:1, 1:N, M:N
  • ✅ Biết các notation styles phổ biến
  • ✅ Thực hành vẽ ERD cho hệ thống thực tế
1

🔍 ERD là gì?

TB5 min

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?

BenefitDescription
📝 DocumentationTài liệu hóa cấu trúc database
🤝 CommunicationGiao tiếp với stakeholders
🔍 AnalysisPhát hiện vấn đề sớm
🏗️ BlueprintBản thiết kế để implement
✅ ValidationVerify với business requirements

Checkpoint

ERD là gì và tại sao ERD lại quan trọng trong quá trình thiết kế database?

2

🏗️ Các thành phần của ERD

TB5 min

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.

Ví dụ
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

TypeDescriptionExample
Strong EntityTồn tại độc lập, có PK riêngCustomer, Product
Weak EntityPhụ thuộc vào entity khácOrderDetail (phụ thuộc Order)

2.2 Attribute (Thuộc tính)

Attribute = Thông tin mô tả entity.

Ví dụ
1Customer Entity:
2- CustomerID (Primary Key)
3- FirstName
4- LastName
5- Email
6- Phone
7- DateOfBirth

Các loại Attribute

TypeDescriptionExample
SimpleKhông thể chia nhỏFirstName, Age
CompositeCó thể chia nhỏAddress (Street, City, ZIP)
DerivedTính từ attribute khácAge (từ DateOfBirth)
MultivaluedNhiều giá trịPhoneNumbers
KeyĐịnh danh duy nhấtCustomerID

2.3 Relationship (Quan hệ)

Relationship = Mối liên kết giữa các entities.

Checkpoint

Hãy nêu sự khác biệt giữa Strong Entity và Weak Entity? Cho ví dụ cụ thể.

3

📊 Cardinality (Bản số)

TB5 min

Cardinality xác định số lượng instances trong một relationship.

3.1 One-to-One (1:1)

One-to-One Relationship

hasEMPLOYEE🔑EmployeeIDINTNameNVARCHAR🔗OfficeIDINTOFFICE🔑OfficeIDINTLocationNVARCHARBuildingNVARCHAR🔑Primary Key🔗Foreign KeyOne (1)Many (N)

SQL Implementation:

SQL
1-- Option 1: FK in either table
2CREATE TABLE Employee (
3 EmployeeID INT PRIMARY KEY,
4 Name NVARCHAR(100),
5 OfficeID INT UNIQUE, -- UNIQUE ensures 1:1
6 FOREIGN KEY (OfficeID) REFERENCES Office(OfficeID)
7);
8
9-- Option 2: Same PK in both tables
10CREATE TABLE EmployeeDetails (
11 EmployeeID INT PRIMARY KEY, -- Same as Employee.EmployeeID
12 SSN VARCHAR(20),
13 FOREIGN KEY (EmployeeID) REFERENCES Employee(EmployeeID)
14);

3.2 One-to-Many (1:N)

One-to-Many Relationship

placesCUSTOMER🔑CustomerIDINTNameNVARCHAREmailNVARCHARPhoneVARCHARORDER🔑OrderIDINT🔗CustomerIDINTOrderDateDATETotalAmountDECIMAL🔑Primary Key🔗Foreign KeyOne (1)Many (N)

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 -> SalesOrderHeader
2SELECT
3 c.CustomerID,
4 COUNT(soh.SalesOrderID) AS OrderCount
5FROM Sales.Customer c
6LEFT JOIN Sales.SalesOrderHeader soh
7 ON c.CustomerID = soh.CustomerID
8GROUP BY c.CustomerID
9ORDER BY OrderCount DESC;

3.3 Many-to-Many (M:N)

Many-to-Many Relationship

hashasSTUDENT🔑StudentIDINTNameNVARCHAREmailNVARCHARENROLLMENT🔑StudentIDINT🔑CourseIDINTEnrollDateDATEGradeCHARCOURSE🔑CourseIDINTCourseNameNVARCHARCreditsINT🔑Primary Key🔗Foreign KeyOne (1)Many (N)

SQL Implementation:

SQL
1-- Cần Junction Table (Bridge Table)
2CREATE TABLE Student (
3 StudentID INT PRIMARY KEY,
4 Name NVARCHAR(100)
5);
6
7CREATE TABLE Course (
8 CourseID INT PRIMARY KEY,
9 CourseName NVARCHAR(100)
10);
11
12-- Junction Table
13CREATE 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 SalesOrderDetail
2SELECT
3 p.ProductID,
4 p.Name AS ProductName,
5 COUNT(DISTINCT sod.SalesOrderID) AS OrderCount
6FROM Production.Product p
7JOIN Sales.SalesOrderDetail sod ON p.ProductID = sod.ProductID
8GROUP BY p.ProductID, p.Name
9ORDER BY OrderCount DESC;

Checkpoint

Giải thích sự khác biệt giữa 3 loại cardinality: 1:1, 1:N, M:N? Relationship M:N cần gì để implement?

4

📝 ERD Notation Styles

TB5 min

4.1 Chen Notation (Original)

Ví dụ
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)

Ví dụ
1┌─────────────┐ ┌─────────────┐
2 │ Customer │ │ Order │
3 ├─────────────┤ ├─────────────┤
4 │ CustomerID │──────┤├──────│ OrderID │
5 │ Name │ │ │ CustomerID │
6 │ Email │ │ │ OrderDate │
7 └─────────────┘ │ └─────────────┘
8
9 ──┤├── One and only one
10 ──┤<── One or many
11 ──○┤── Zero or one
12 ──○<── Zero or many

4.3 UML Class Diagram Style

Ví dụ
1┌─────────────────┐ ┌─────────────────┐
2 │ Customer │ │ Order │
3 ├─────────────────┤ ├─────────────────┤
4 │ +CustomerID: PK │ 1 * │ +OrderID: PK │
5 │ +Name: string ├─────────┤ +CustomerID: FK │
6 │ +Email: string │ │ +OrderDate: date│
7 └─────────────────┘ └─────────────────┘

Checkpoint

ERD Notation phổ biến nhất hiện nay là gì? Hãy giải thích ký hiệu Crow's Foot.

5

📐 Vẽ ERD cho AdventureWorks

TB5 min

5.1 Sales Module ERD

AdventureWorks Sales Module

placescontainsfromcontainsincluded_inCUSTOMER🔑CustomerIDINT🔗PersonIDINT🔗StoreIDINT🔗TerritoryIDINTSALESTERRITORY🔑TerritoryIDINTNameNVARCHARCountryCodeNVARCHARGroupNVARCHARSALESORDERHEADER🔑SalesOrderIDINT🔗CustomerIDINT🔗TerritoryIDINTOrderDateDATETotalDueMONEYSALESORDERDETAIL🔑SalesOrderIDINT🔑SalesOrderDetailIDINT🔗ProductIDINTOrderQtySMALLINTUnitPriceMONEYPRODUCT🔑ProductIDINTNameNVARCHARProductNumberNVARCHAR🔗CategoryIDINT🔑Primary Key🔗Foreign KeyOne (1)Many (N)

5.2 Query để hiểu ERD

SQL
1-- Xem structure của Sales module
2SELECT
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 IsFK
9FROM sys.tables t
10JOIN sys.columns c ON t.object_id = c.object_id
11JOIN sys.types ty ON c.user_type_id = ty.user_type_id
12LEFT JOIN (
13 SELECT ic.object_id, ic.column_id
14 FROM sys.index_columns ic
15 JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
16 WHERE i.is_primary_key = 1
17) pk ON t.object_id = pk.object_id AND c.column_id = pk.column_id
18LEFT JOIN sys.foreign_key_columns fk ON t.object_id = fk.parent_object_id AND c.column_id = fk.parent_column_id
19WHERE SCHEMA_NAME(t.schema_id) = 'Sales'
20ORDER BY t.name, c.column_id;

Checkpoint

Trong Sales Module của AdventureWorks, Customer và SalesOrderHeader có mối quan hệ gì?

6

💡 Best Practices khi vẽ ERD

TB5 min

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 Key
7 - 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ần
15 - Focus vào một module/area
16
175. **Review với stakeholders**
18 - Verify business rules
19 - Ensure completeness

DON'T ❌

markdown
11. **Đừng vẽ quá chi tiết ban đầu**
2 - Bắt đầu từ high-level
3 - Thêm chi tiết dần dần
4
52. **Đừng bỏ qua M:N relationships**
6 - Luôn cần junction table
7 - Có thể có attributes riêng
8
93. **Đừng quên derived attributes**
10 - Age từ DateOfBirth
11 - TotalAmount từ calculations
12
134. **Đừng design trong isolation**
14 - Involve business users
15 - Validate assumptions

Checkpoint

Khi vẽ ERD, entity nên được đặt tên theo quy tắc nào? Tại sao cần review ERD với stakeholders?

7

🔧 Công cụ vẽ ERD

TB5 min

7.1 SQL Server Management Studio

SQL
1-- 1. Trong SSMS, right-click database
2-- 2. Chọn "Database Diagrams"
3-- 3. Create New Diagram
4-- 4. Add tables và SSMS tự vẽ relationships

7.2 Online Tools

ToolURLFeatures
dbdiagram.iodbdiagram.ioSimple, export SQL
Lucidchartlucidchart.comCollaborative
draw.iodraw.ioFree, flexible
ERDPluserdplus.comAcademic

7.3 dbdiagram.io Syntax

Ví dụ
1// Paste vào dbdiagram.io
2Table Customer {
3 CustomerID int [pk]
4 FirstName varchar
5 LastName varchar
6 Email varchar
7}
8
9Table Order {
10 OrderID int [pk]
11 CustomerID int [ref: > Customer.CustomerID]
12 OrderDate date
13 TotalAmount decimal
14}
15
16Table OrderDetail {
17 OrderID int [pk, ref: > Order.OrderID]
18 ProductID int [pk, ref: > Product.ProductID]
19 Quantity int
20 UnitPrice decimal
21}
22
23Table Product {
24 ProductID int [pk]
25 ProductName varchar
26 CategoryID int
27 UnitPrice decimal
28}

Checkpoint

Hãy kể tên ít nhất 3 công cụ vẽ ERD phổ biến? Công cụ nào miễn phí và dễ sử dụng nhất?

8

🛠️ Hands-on Exercise

TB5 min

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:

  1. Xác định Entities
  2. Xác định Attributes cho mỗi entity
  3. Xác định Relationships và Cardinality
  4. Vẽ ERD (dùng công cụ bất kỳ)
  5. Viết SQL CREATE TABLE statements

Solution Outline

Library System ERD

makesborrowed_incontainsMEMBER🔑MemberIDINTNameNVARCHAREmailNVARCHARPhoneVARCHARJoinDateDATEBORROWING🔑BorrowingIDINT🔗MemberIDINT🔗BookIDINTBorrowDateDATEDueDateDATEReturnDateDATEStatusVARCHARBOOK🔑BookIDINTTitleNVARCHARISBNVARCHARAuthorNVARCHAR🔗CategoryIDINTTotalCopiesINTCATEGORY🔑CategoryIDINTCategoryNameNVARCHARDescriptionNVARCHAR🔑Primary Key🔗Foreign KeyOne (1)Many (N)

Checkpoint

Trong bài tập Library System, mối quan hệ giữa Member và Book là gì? Tại sao cần bảng Borrowing?

🚀 Bài tiếp theo

Bài tiếp theo: Normalization - Chuẩn hóa Cơ sở dữ liệu

Học cách chuẩn hóa database để loại bỏ redundancy và đảm bảo data integrity!