MinAI - Về trang chủ
Lý thuyết
1/132 giờ
Đang tải...

Database Fundamentals

Nền tảng cơ sở dữ liệu: RDBMS, Data Types, Keys, Constraints, Normalization, Schema và Data Dictionary

0

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

TB5 min

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

✅ Hiểu Database là gì, RDBMS hoạt động ra sao và tại sao dùng nó

✅ Phân biệt các Data Types phổ biến trong SQL Server

✅ Nắm vững Primary Key, Foreign Key, Composite Key và Relationships

✅ Áp dụng Constraints để bảo vệ tính toàn vẹn dữ liệu

✅ Hiểu Normalization (1NF → 2NF → 3NF) để thiết kế database tốt

✅ Đọc hiểu Schema và Data Dictionary của một database thực tế

Thời gian: 1.5 giờ | Độ khó: Beginner | Yêu cầu: Không

1

📖 Bảng Thuật Ngữ Quan Trọng

TB5 min
Thuật ngữTiếng ViệtMô tả
DatabaseCơ sở dữ liệuKho chứa dữ liệu có tổ chức
RDBMSHệ quản trị CSDL quan hệPhần mềm quản lý database theo mô hình bảng
TableBảngCấu trúc lưu dữ liệu theo hàng và cột
Row (Record)Hàng (Bản ghi)Một đối tượng/thực thể trong bảng
Column (Field)Cột (Trường)Một thuộc tính của đối tượng
Primary Key (PK)Khóa chínhCột định danh duy nhất mỗi row
Foreign Key (FK)Khóa ngoạiCột tham chiếu đến PK bảng khác
ConstraintRàng buộcQuy tắc bắt buộc dữ liệu phải tuân theo
Data TypeKiểu dữ liệuLoại giá trị cột có thể chứa (INT, VARCHAR...)
SchemaLược đồNhóm logic để tổ chức các bảng
NormalizationChuẩn hóaQuy trình loại bỏ dữ liệu dư thừa
Data DictionaryTừ điển dữ liệuTài liệu mô tả cấu trúc database
ERDSơ đồ quan hệ thực thểBiểu đồ thể hiện tables và relationships

Checkpoint

Database = "kho chứa dữ liệu có tổ chức". RDBMS = "phần mềm quản lý kho đó". Bạn phân biệt được 2 khái niệm này chưa?

2

💡 1. Database là gì?

TB5 min

📚 Định nghĩa

Database (Cơ sở dữ liệu) là tập hợp dữ liệu được tổ chức, lưu trữ và quản lý một cách có hệ thống để có thể truy xuất, cập nhật và phân tích dễ dàng.

💡 Ý nghĩa — Tại sao cần Database?

Hãy tưởng tượng bạn quản lý thông tin 10,000 khách hàng:

Không có DatabaseCó Database
Lưu trong Excel, dễ trùng lặpMỗi khách hàng có ID duy nhất
Nhiều file rời rạc, không liên kếtCác bảng liên kết chặt chẽ qua Keys
Ai cũng sửa được, không kiểm soátPhân quyền truy cập, có ràng buộc dữ liệu
Chậm khi tìm kiếmIndex giúp truy vấn hàng triệu records trong milliseconds
Không thể phân tích phức tạpSQL cho phép phân tích đa chiều

🏢 Ứng dụng thực tế

  • 🏦 Ngân hàng: Quản lý tài khoản, giao dịch, khoản vay
  • 🛒 E-commerce: Sản phẩm, đơn hàng, khách hàng, thanh toán
  • 🏥 Bệnh viện: Hồ sơ bệnh nhân, lịch khám, đơn thuốc
  • 📊 Data Analytics: Data warehouse cho phân tích kinh doanh

1.4 RDBMS — Relational Database Management System

RDBMS là phần mềm quản lý database theo mô hình quan hệ (relational model):

  • Dữ liệu được tổ chức thành tables (bảng)
  • Các bảng liên kết với nhau qua keys (khóa)
  • Truy vấn bằng ngôn ngữ SQL (Structured Query Language)
RDBMSNhà phát triểnĐặc điểm
SQL ServerMicrosoftEnterprise-grade, tích hợp Azure, T-SQL
PostgreSQLOpen SourceMạnh mẽ, mở rộng tốt, ANSI SQL
MySQLOraclePhổ biến nhất, phù hợp web apps
Oracle DBOracleEnterprise, banking, telco
Tại sao chọn SQL Server?

Khóa này dùng SQL Server vì: (1) Tích hợp BI tools mạnh (SSRS, SSAS, SSIS), (2) T-SQL có nhiều functions hữu ích cho analytics, (3) Azure-ready cho cloud analytics, (4) Được dùng rộng rãi trong doanh nghiệp Việt Nam.

Checkpoint

RDBMS lưu dữ liệu theo bảng (tables). Các bảng liên kết qua khóa (keys). Truy vấn bằng SQL. Ba khái niệm này là nền tảng — bạn ghi nhớ chưa?

3

📊 2. Table, Row, Column — Cấu trúc cơ bản

TB5 min

📚 Định nghĩa

Một Table (bảng) là đơn vị lưu trữ chính trong RDBMS:

📊 Table: Employees (Nhân viên)
EmpID (INT)FirstName (VARCHAR)LastName (VARCHAR)Department (VARCHAR)Salary (MONEY)
1NguyễnVăn AIT25,000,000
2TrầnThị BHR20,000,000
3Minh CSales22,000,000

↑ Mỗi cột (Column) là 1 thuộc tính — Mỗi hàng (Row) là 1 bản ghi (Record)

2.2 Các khái niệm

Khái niệmTương đương ExcelÝ nghĩa
TableSheetBảng chứa dữ liệu về 1 chủ đề
Row (Record)Dòng1 bản ghi / 1 đối tượng
Column (Field)Cột1 thuộc tính của đối tượng
CellÔ1 giá trị cụ thể tại giao (row, column)

💡 Ý nghĩa

Table/Row/Column là ngôn ngữ chung của mọi relational database. Khi ai đó nói “table Customers có 50,000 rows”, bạn hiểu ngay: có 50,000 khách hàng. Hiểu cấu trúc này giúp bạn:

  • Đọc bất kỳ database nào (SQL Server, PostgreSQL, MySQL)
  • Hiểu ERD và Data Dictionary ngay lập tức
  • Viết SQL chính xác (biết SELECT lấy columns nào, FROM table nào)

🏢 Ứng dụng

Hệ thốngTables chínhRows (quy mô)
E-commerceCustomers, Products, OrdersHàng triệu
Ngân hàngAccounts, TransactionsHàng tỷ
Bệnh việnPatients, Appointments, PrescriptionsHàng trăm nghìn
HREmployees, Departments, PayrollHàng nghìn

2.3 Ví dụ thực tế — Database E-commerce

Cấu trúc Database E-commerce

🗄️Database: ShopOnline
📋Customers (Khách hàng)
CustomerID, Name, Email, Phone, Address
50,000 rows
📦Products (Sản phẩm)
ProductID, Name, Price, CategoryID, Stock
2,000 rows
🛒Orders (Đơn hàng)
OrderID, CustomerID, OrderDate, TotalAmount, Status
200,000 rows
📝OrderDetails (Chi tiết đơn hàng)
OrderDetailID, OrderID, ProductID, Quantity, UnitPrice
500,000 rows
Quy tắc đặt tên
  • Table: danh từ số nhiều (Customers, Products, Orders)
  • Column: mô tả rõ ràng (FirstName thay vì FN, OrderDate thay vì Date)
  • Tránh: khoảng trắng, ký tự đặc biệt, từ khóa SQL (SELECT, FROM...)

Checkpoint

Table = bảng, Row = hàng (1 bản ghi), Column = cột (1 thuộc tính). Một table "Orders" với 200,000 rows nghĩa là có 200,000 đơn hàng. Bạn thấy logic chưa?

4

🔍 3. Data Types — Kiểu dữ liệu

TB5 min

📚 Định nghĩa

Data Type quy định loại giá trị mà một column có thể chứa. Chọn đúng data type giúp:

  • Tiết kiệm bộ nhớ (INT 4 bytes vs BIGINT 8 bytes)
  • Đảm bảo tính đúng đắn (không thể nhập text vào cột kiểu INT)
  • Tối ưu hiệu suất (query trên INT nhanh hơn trên VARCHAR)

💡 Ý nghĩa

Chọn sai data type là lỗi thiết kế phổ biến nhất và rất khó sửa sau khi database đã có dữ liệu:

  • Dùng VARCHAR cho tiếng Việt → mất dấu (“Nguyễn” → “Nguy?n”)
  • Dùng FLOAT cho tiền → sai số tích lũy (0.1 + 0.2 ≠ 0.3)
  • Dùng VARCHAR cho số → không thể SUM, không sort đúng (“9” > “10” vì so chuỗi)

🏢 Ứng dụng

Lĩnh vựcVí dụ cần chọn đúng
Tài chínhTiền → DECIMAL(18,2) (tuyệt đối không FLOAT)
HRTên tiếng Việt → NVARCHAR (không VARCHAR)
E-commerceSĐT → VARCHAR(15) (text, có thể có +84, dấu -)
IoT/SensorsTimestamp → DATETIME2(3) (chính xác millisecond)

3.2 Các Data Types phổ biến trong SQL Server

Số (Numeric)

Data TypeKích thướcPhạm viKhi nào dùng
INT4 bytes-2.1 tỷ → 2.1 tỷID, số lượng, tuổi
BIGINT8 bytesRất lớnID hệ thống lớn
SMALLINT2 bytes-32,768 → 32,767Giá trị nhỏ (tháng, ngày)
TINYINT1 byte0 → 255Trạng thái, rating 1-5
DECIMAL(p,s)5-17 bytesChính xácTiền, tỷ lệ phần trăm
MONEY8 bytesTiền tệGiá sản phẩm, lương
FLOAT4-8 bytesXấp xỉTính toán khoa học
SQL
1-- Ví dụ
2CREATE TABLE Products (
3 ProductID INT, -- ID sản phẩm: số nguyên
4 Price DECIMAL(10, 2), -- Giá: 10 chữ số, 2 sau dấu thập phân
5 Weight FLOAT, -- Cân nặng: số thập phân xấp xỉ
6 Rating TINYINT -- Đánh giá: 1-5 stars
7);
DECIMAL vs FLOAT

Dùng DECIMAL cho tiền và giá trị cần chính xác tuyệt đối. FLOAT có sai số nhỏ — 0.1 + 0.2 ≠ 0.3 trong FLOAT! Không bao giờ dùng FLOAT cho tiền.

Chuỗi (String)

Data TypeKích thướcÝ nghĩaKhi nào dùng
CHAR(n)n bytes cố địnhChuỗi cố địnhMã quốc gia (VN), giới tính (M/F)
VARCHAR(n)Thay đổi, max nChuỗi thay đổiTên, email, địa chỉ
VARCHAR(MAX)Đến 2GBChuỗi rất dàiMô tả sản phẩm, nội dung bài viết
NVARCHAR(n)2× bytes, UnicodeHỗ trợ UnicodeTiếng Việt, tiếng Nhật, emoji
NCHAR(n)2n bytes cố địnhUnicode cố địnhMã Unicode cố định
SQL
1-- Ví dụ
2CREATE TABLE Customers (
3 CustomerID INT,
4 FirstName NVARCHAR(50), -- Unicode cho tiếng Việt
5 Email VARCHAR(100), -- Email chỉ có ASCII
6 Gender CHAR(1), -- 'M' hoặc 'F' — luôn 1 ký tự
7 Bio NVARCHAR(MAX) -- Giới thiệu bản thân — độ dài tùy ý
8);
VARCHAR vs NVARCHAR

Dữ liệu tiếng Việt (có dấu) bắt buộc dùng NVARCHAR. VARCHAR không lưu đúng được "Nguyễn", "Phạm", "Trần". Quy tắc: dữ liệu có thể chứa tiếng Việt → NVARCHAR.

Ngày giờ (Date/Time)

Data TypeÝ nghĩaVí dụKhi nào dùng
DATEChỉ ngày2026-01-15Ngày sinh, ngày đặt hàng
TIMEChỉ giờ14:30:00Giờ bắt đầu ca, deadline
DATETIMENgày + giờ2026-01-15 14:30:00Timestamp chung
DATETIME2Chính xác hơn2026-01-15 14:30:00.1234567Audit logs

Logic và khác

Data TypeÝ nghĩaKhi nào dùng
BIT0 hoặc 1Cờ: IsActive, IsDeleted
UNIQUEIDENTIFIERGUIDID phân tán, không đoán được

3.3 Chọn Data Type đúng — Checklist

🧭 Checklist chọn Data Type
Câu hỏi→ Data Type
Là số nguyên?INT (hoặc BIGINT nếu > 2 tỷ)
Là tiền?DECIMAL(p,s) hoặc MONEY
Là text tiếng Việt?NVARCHAR(n)
Là text ASCII only?VARCHAR(n)
Là ngày (không giờ)?DATE
Là ngày + giờ?DATETIME2
Là True/False?BIT
Là mã cố định?CHAR(n) hoặc NCHAR(n)

Checkpoint

Tiền → DECIMAL (không phải FLOAT). Tiếng Việt → NVARCHAR (không phải VARCHAR). True/False → BIT. Ba quy tắc này sẽ giúp bạn tránh 90% lỗi data type!

5

🔑 4. Keys — Khóa trong Database

TB5 min

📚 Định nghĩa

Key (khóa) là column hoặc tổ hợp columns dùng để định danh duy nhất mỗi row và liên kết các bảng với nhau. Keys là xương sống của relational database.

4.2 Primary Key (PK) — Khóa chính

Định nghĩa: Column (hoặc tổ hợp columns) có giá trị duy nhất cho mỗi row, dùng để định danh row đó.

💡 Ý nghĩa: PK là “số CMND” của mỗi row — nhờ PK, bạn có thể tìm chính xác 1 row trong hàng triệu rows. Không có PK, bạn không thể phân biệt 2 “Nguyễn Văn A” khác nhau.

Quy tắc:

  • ✅ Mỗi bảng chỉ có 1 Primary Key
  • ✅ Giá trị phải duy nhất (unique) — không trùng
  • ✅ Không được NULL — luôn phải có giá trị
  • ✅ Thường là cột ID tự tăng (IDENTITY)
SQL
1-- Ví dụ tạo bảng với Primary Key
2CREATE TABLE Departments (
3 DepartmentID INT IDENTITY(1,1) PRIMARY KEY, -- Tự tăng: 1, 2, 3...
4 Name NVARCHAR(100) NOT NULL,
5 GroupName NVARCHAR(100) NOT NULL
6);

Ứng dụng: Khi bạn nói "nhân viên số 102", PK EmployeeID = 102 xác định chính xác 1 người duy nhất.

4.3 Foreign Key (FK) — Khóa ngoại

Định nghĩa: Column trong bảng này tham chiếu đến Primary Key của bảng khác, tạo mối quan hệ (relationship) giữa 2 bảng.

Ý nghĩa: FK đảm bảo dữ liệu tham chiếu luôn hợp lệ — không thể có đơn hàng của khách hàng không tồn tại.

SQL
1-- Orders có FK tham chiếu đến Customers
2CREATE TABLE Orders (
3 OrderID INT IDENTITY(1,1) PRIMARY KEY,
4 CustomerID INT NOT NULL, -- FK → Customers.CustomerID
5 OrderDate DATE NOT NULL,
6 TotalAmount DECIMAL(12,2),
7 FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
8);
🔗 Foreign Key: Customers → Orders

Customers (Bảng cha)

CustomerID (PK)Name
1Nguyễn A
2Trần B
3Lê C

Orders (Bảng con)CustomerID là FK tham chiếu đến Customers.CustomerID

OrderID (PK)CustomerID (FK)OrderDate
1011 ← Nguyễn A2026-01-01
1021 ← Nguyễn A2026-01-05
1032 ← Trần B2026-01-10

OrderID 104, CustomerID = 99LỖI! (CustomerID 99 không tồn tại)

🏢 Ứng dụng: FK được dùng trong mọi database có nhiều bảng: đơn hàng → khách hàng, nhân viên → phòng ban, bài viết → tác giả. Khi viết JOIN (bài sau), bạn sẽ luôn join qua FK.

4.4 Composite Key — Khóa tổ hợp

Định nghĩa: Primary Key gồm nhiều columns kết hợp — khi 1 column không đủ để định danh duy nhất.

SQL
1-- OrderDetails: mỗi row là 1 sản phẩm trong 1 đơn hàng
2-- Composite PK: (OrderID, ProductID) — cùng đơn hàng + cùng sản phẩm = unique
3CREATE TABLE OrderDetails (
4 OrderID INT,
5 ProductID INT,
6 Quantity INT NOT NULL,
7 UnitPrice DECIMAL(10,2) NOT NULL,
8 PRIMARY KEY (OrderID, ProductID), -- Composite Key
9 FOREIGN KEY (OrderID) REFERENCES Orders(OrderID),
10 FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
11);

💡 Ý nghĩa: Composite Key xuất hiện phổ biến trong các bảng trung gian (junction tables) của mối quan hệ Many-to-Many, và trong bảng chi tiết (OrderDetails, EnrollmentDetails).

🏢 Ứng dụng: OrderDetails dùng Composite Key (OrderID, ProductID) — nghĩa là cùng 1 đơn hàng + cùng 1 sản phẩm chỉ xuất hiện 1 lần.

4.5 Relationships — Các loại quan hệ

Quan hệÝ nghĩaVí dụ
One-to-One (1:1)1 row bên A ↔ 1 row bên BEmployee ↔ EmployeeDetail
One-to-Many (1:N)1 row bên A ↔ nhiều rows bên BCustomer → nhiều Orders
Many-to-Many (M:N)Nhiều rows ↔ nhiều rows, qua bảng trung gianStudents ↔ Courses (qua Enrollments)
🔗 Các loại Relationship

One-to-Many (phổ biến nhất):

Customers (1)Orders (N)
PK: CustID─── 1:N ───▶FK: CustID
1 khách hàngnhiều đơn hàng

Many-to-Many (qua bảng trung gian):

StudentsEnrollmentsCourses
PK: StuID── M ──▶FK: StuID, FK: CrsID◀── N ──PK: CrsID
PK: (StuID, CrsID)

Checkpoint

PK = định danh duy nhất 1 row. FK = liên kết đến PK bảng khác. Composite Key = PK từ nhiều columns. Mối quan hệ 1:N là phổ biến nhất (1 khách hàng → nhiều đơn hàng).

6

🛡️ 5. Constraints — Ràng buộc dữ liệu

TB5 min

📚 Định nghĩa

Constraint (ràng buộc) là quy tắc áp dụng lên column hoặc table để đảm bảo tính toàn vẹn dữ liệu — ngăn chặn dữ liệu sai hoặc không hợp lệ được insert vào database.

💡 Ý nghĩa — Tại sao cần Constraints?

Không có constraints, dữ liệu có thể bị:

  • Nhập email trùng cho 2 khách hàng khác nhau
  • Đặt tuổi = -5 hoặc giá sản phẩm âm
  • Để trống tên khách hàng
  • Tham chiếu đến sản phẩm không tồn tại

5.3 Các loại Constraints

ConstraintÝ nghĩaVí dụ
NOT NULLKhông được để trốngTên khách hàng bắt buộc
UNIQUEGiá trị phải duy nhấtEmail không được trùng
PRIMARY KEYNOT NULL + UNIQUEID định danh mỗi row
FOREIGN KEYTham chiếu hợp lệOrderID phải tồn tại trong Orders
CHECKĐiều kiện logicTuổi >= 0, Giá > 0
DEFAULTGiá trị mặc địnhStatus mặc định = 'Active'

5.4 Ví dụ tổng hợp

SQL
1CREATE TABLE Employees (
2 -- PRIMARY KEY: định danh duy nhất
3 EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
4
5 -- NOT NULL: bắt buộc nhập
6 FirstName NVARCHAR(50) NOT NULL,
7 LastName NVARCHAR(50) NOT NULL,
8
9 -- UNIQUE: không trùng
10 Email VARCHAR(100) NOT NULL UNIQUE,
11
12 -- CHECK: kiểm tra điều kiện
13 Age INT CHECK (Age >= 18 AND Age <= 100),
14 Salary DECIMAL(12,2) CHECK (Salary > 0),
15
16 -- DEFAULT: giá trị mặc định
17 Status VARCHAR(20) DEFAULT 'Active',
18 CreatedDate DATETIME2 DEFAULT GETDATE(),
19
20 -- FOREIGN KEY: tham chiếu bảng khác
21 DepartmentID INT NOT NULL,
22 FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID)
23);

5.5 Constraint trong thực tế

SQL
1-- ✅ Hợp lệ
2INSERT INTO Employees (FirstName, LastName, Email, Age, Salary, DepartmentID)
3VALUES (N'Nguyễn', N'Văn A', 'a.nguyen@company.com', 25, 15000000, 1);
4
5-- ❌ LỖI: Age < 18 → vi phạm CHECK constraint
6INSERT INTO Employees (FirstName, LastName, Email, Age, Salary, DepartmentID)
7VALUES (N'Trần', N'Thị B', 'b.tran@company.com', 15, 10000000, 1);
8
9-- ❌ LỖI: Email trùng → vi phạm UNIQUE constraint
10INSERT INTO Employees (FirstName, LastName, Email, Age, Salary, DepartmentID)
11VALUES (N'Lê', N'Minh C', 'a.nguyen@company.com', 30, 20000000, 2);
12
13-- ❌ LỖI: DepartmentID = 99 không tồn tại → vi phạm FOREIGN KEY
14INSERT INTO Employees (FirstName, LastName, Email, Age, Salary, DepartmentID)
15VALUES (N'Phạm', N'Đức D', 'd.pham@company.com', 28, 18000000, 99);
Best Practice

Luôn thêm constraints khi thiết kế bảng. Phát hiện lỗi dữ liệu ở đầu vào dễ hơn rất nhiều so với sửa dữ liệu sai đã nằm trong database.

🏢 Ứng dụng thực tế

Hệ thốngConstraintMục đích
E-commerceCHECK (Quantity > 0)Không cho đặt số lượng âm
BankingCHECK (Balance >= 0)Tài khoản không âm
HRUNIQUE (Email)Mỗi nhân viên 1 email duy nhất
HospitalNOT NULL (PatientName)Bắt buộc có tên bệnh nhân

Checkpoint

NOT NULL = bắt buộc. UNIQUE = không trùng. CHECK = điều kiện logic. DEFAULT = giá trị mặc định. Tất cả đều giúp ngăn dữ liệu xấu vào database.

7

📐 6. Normalization — Chuẩn hóa Database

TB5 min

📚 Định nghĩa

Normalization là quy trình tổ chức dữ liệu trong database để:

  • Loại bỏ dữ liệu dư thừa (redundancy)
  • Tránh bất thường khi INSERT/UPDATE/DELETE (anomalies)
  • Đảm bảo tham chiếu toàn vẹn (data integrity)

💡 Ý nghĩa — Tại sao cần Normalization?

Bảng chưa chuẩn hóa:

OrderIDCustomerNameCustomerPhoneProductNamePriceQty
1Nguyễn A0901234567Laptop Dell25tr1
2Nguyễn A0901234567Chuột Logitech500k2
3Trần B0912345678Laptop Dell25tr1

Vấn đề:

  • 🔴 Dư thừa: "Nguyễn A" và SĐT lặp lại 2 lần
  • 🔴 Update anomaly: Đổi SĐT Nguyễn A phải sửa ở nhiều rows
  • 🔴 Delete anomaly: Xóa đơn hàng 3 → mất luôn thông tin Trần B
  • 🔴 Insert anomaly: Không thể thêm khách mới chưa có đơn hàng

6.3 First Normal Form (1NF)

Quy tắc: Mỗi cell chỉ chứa 1 giá trị duy nhất (atomic values). Không có cột lặp lại.

❌ Vi phạm 1NF → ✅ 1NF

❌ Vi phạm: Nhiều giá trị trong 1 cell!

OrderIDProducts
1Laptop, Chuột, Bàn phím

✅ Đạt 1NF: Mỗi cell chỉ 1 giá trị

OrderIDProduct
1Laptop
1Chuột
1Bàn phím

6.4 Second Normal Form (2NF)

Quy tắc: Đã đạt 1NF + mọi non-key column phải phụ thuộc vào toàn bộ Primary Key (không chỉ 1 phần).

❌ Vi phạm 2NF → ✅ 2NF

❌ Vi phạm (PK: OrderID + ProductID):

OrderIDProductIDCustomerNameProductNameQty

CustomerName chỉ phụ thuộc OrderID, không phụ thuộc ProductID!

✅ 2NF — Tách thành 2 bảng:

Orders: OrderID, CustIDOrderDetails: OrderID, ProductID, Qty

6.5 Third Normal Form (3NF)

Quy tắc: Đã đạt 2NF + không có phụ thuộc bắc cầu (transitive dependency).

❌ Vi phạm 3NF → ✅ 3NF

❌ Vi phạm:

EmpIDDeptIDDeptNameDeptLocation

DeptNameDeptLocation phụ thuộc vào DeptID, không phải EmpID! (EmpID → DeptID → DeptName: phụ thuộc bắc cầu)

✅ 3NF — Tách Department ra:

Employees: EmpID, DeptIDDepartments: DeptID, DeptName, DeptLocation

6.6 Ví dụ chuẩn hóa hoàn chỉnh

Bảng gốc (chưa chuẩn hóa):

| OrderID | CustName | CustPhone | ProductName | Price | Qty | Total |

Sau khi chuẩn hóa (3NF):

Chuẩn hóa 3NF — E-commerce

Customers🔑CustIDINTNameNVARCHARPhoneVARCHAROrders🔑OrderIDINT🔗CustIDINTOrderDateDATEOrderDetails🔗OrderIDINT🔗ProductIDINTQuantityINTProducts🔑ProdIDINTNameNVARCHARPriceDECIMAL🔑Primary Key🔗Foreign KeyOne (1)Many (N)
Quy tắc nhớ nhanh
  • 1NF: Mỗi cell = 1 giá trị (không nhồi list vào 1 ô)
  • 2NF: Non-key columns phụ thuộc toàn bộ PK
  • 3NF: Non-key columns chỉ phụ thuộc PK, không phụ thuộc lẫn nhau

🏢 Ứng dụng

ChuẩnỨng dụng thực tế
1NFTách “skills: Python, SQL” thành bảng riêng EmployeeSkills — mỗi row 1 skill
2NFTách thông tin khách hàng ra khỏi bảng đơn hàng — tránh lặp tên/SĐT
3NFTách Department (DeptID, DeptName, Manager) ra khỏi Employee — tránh phụ thuộc bắc cầu

Trong thực tế, đạt 3NF là đủ tốt cho hầu hết hệ thống. Các chuẩn cao hơn (BCNF, 4NF, 5NF) hiếm khi cần thiết.

Checkpoint

1NF: atomic values. 2NF: full dependency on PK. 3NF: no transitive dependency. Trong thực tế, hầu hết database đạt 3NF là đủ tốt. Bạn hiểu 3 mức này chưa?

8

📁 7. Schema và Data Dictionary

TB5 min

7.1 Schema — Lược đồ

Định nghĩa: Schema là nhóm logic để tổ chức các bảng trong database, giống như "thư mục" phân loại tables.

Ý nghĩa: Trong database lớn (hàng trăm tables), schema giúp:

  • Phân loại tables theo chức năng kinh doanh
  • Quản lý quyền truy cập (phòng HR chỉ xem schema HumanResources)
  • Tránh xung đột tên (HR.Employee vs Sales.Employee)

Ví dụ — AdventureWorks:

Cấu trúc Schema — AdventureWorks

🗄️Database: AdventureWorks
📁Schema: HumanResources — Nhân sự
Employee
Department
EmployeePayHistory
Shift
📁Schema: Sales — Bán hàng
Customer
SalesOrderHeader
SalesOrderDetail
SalesTerritory
📁Schema: Production — Sản xuất
Product
ProductCategory
ProductSubcategory
ProductInventory
📁Schema: Purchasing — Mua hàng
Vendor
PurchaseOrderHeader
📁Schema: Person — Thông tin cá nhân
Person
Address
EmailAddress
PersonPhone

Cú pháp truy cập: Schema.TableName

SQL
1-- Truy cập table Employee trong schema HumanResources
2SELECT * FROM HumanResources.Employee;
3
4-- Truy cập table Product trong schema Production
5SELECT * FROM Production.Product;

7.2 Data Dictionary — Từ điển dữ liệu

Định nghĩa: Data Dictionary là tài liệu mô tả chi tiết cấu trúc database: mỗi table có những columns nào, data type gì, constraint gì, ý nghĩa ra sao.

Tại sao cần?

  • Data Analyst mới vào công ty đọc Data Dictionary để hiểu database
  • Developer tham khảo khi viết queries
  • Đảm bảo team cùng hiểu ý nghĩa dữ liệu

Ví dụ Data Dictionary cho table HumanResources.Employee:

ColumnData TypeNullableKeyMô tả
BusinessEntityIDINTNOT NULLPK, FKID nhân viên, tham chiếu Person.Person
NationalIDNumberNVARCHAR(15)NOT NULLUNIQUESố CMND/CCCD
LoginIDNVARCHAR(256)NOT NULLTên đăng nhập domain
JobTitleNVARCHAR(50)NOT NULLChức danh
BirthDateDATENOT NULLNgày sinh
MaritalStatusNCHAR(1)NOT NULLM = Married, S = Single
GenderNCHAR(1)NOT NULLM = Male, F = Female
HireDateDATENOT NULLNgày vào làm
SalariedFlagBITNOT NULL1 = lương cố định, 0 = theo giờ
VacationHoursSMALLINTNOT NULLSố giờ nghỉ phép còn lại
SickLeaveHoursSMALLINTNOT NULLSố giờ nghỉ ốm còn lại
CurrentFlagBITNOT NULL1 = đang làm việc, 0 = đã nghỉ
ModifiedDateDATETIMENOT NULLNgày sửa cuối cùng

7.3 ERD — Entity Relationship Diagram

Định nghĩa: ERD là sơ đồ trực quan thể hiện các tables và relationships giữa chúng.

Ứng dụng: Nhìn ERD, bạn biết ngay:

  • Có những tables nào
  • Tables nào liên kết với nhau
  • Qua columns nào (PK-FK)
  • Loại quan hệ gì (1:1, 1:N, M:N)

AdventureWorks HR — ERD

Person🔑BusinessEntityIDINTFirstNameNVARCHARLastNameNVARCHAREmployee🔑BusinessEntityIDINTJobTitleNVARCHARHireDateDATEEmpDeptHistory🔗BusinessEntityIDINT🔗DepartmentIDINT🔗ShiftIDINTStartDateDATEEndDateDATE🔑Primary Key🔗Foreign KeyOne (1)Many (N)
Luôn đọc trước khi viết SQL

Trước khi viết bất kỳ câu SQL nào, hãy xem ERDData Dictionary trước. Bạn cần biết: (1) Dữ liệu nằm ở table nào? (2) Tables liên kết qua column nào? (3) Column có data type gì?

Checkpoint

Schema phân nhóm tables. Data Dictionary mô tả chi tiết columns. ERD cho thấy relationships. Ba công cụ này giúp bạn hiểu database trước khi viết 1 dòng SQL nào!

9

🏋️ 8. Thực hành

TB5 min

Exercise 1: Xác định Data Types

Cho các columns sau, hãy chọn Data Type phù hợp nhất:

ColumnMô tảData Type?
StudentIDID sinh viên?
FullNameHọ tên (tiếng Việt)?
EmailĐịa chỉ email?
GPAĐiểm trung bình (0.00-4.00)?
IsGraduatedĐã tốt nghiệp chưa?
EnrollDateNgày nhập học?
PhoneNumberSố điện thoại?
💡 Xem đáp án
ColumnData TypeGiải thích
StudentIDINT IDENTITY(1,1)Số nguyên tự tăng
FullNameNVARCHAR(100)Unicode cho tiếng Việt
EmailVARCHAR(100)Email chỉ ASCII
GPADECIMAL(3,2)Chính xác: 0.00-4.00
IsGraduatedBITTrue/False
EnrollDateDATEChỉ cần ngày, không cần giờ
PhoneNumberVARCHAR(15)Text (SĐT có thể có +84, dấu -)

Exercise 2: Xác định Keys và Relationships

Cho hệ thống quản lý thư viện:

  • Books: BookID, Title, AuthorID, CategoryID, ISBN, PublishYear
  • Authors: AuthorID, Name, Nationality
  • Categories: CategoryID, CategoryName
  • Members: MemberID, Name, Email, JoinDate
  • BorrowRecords: BorrowID, MemberID, BookID, BorrowDate, ReturnDate

Câu hỏi:

  1. PK của mỗi bảng là gì?
  2. FK nằm ở đâu?
  3. Relationships giữa các bảng?
💡 Xem đáp án

Primary Keys:

  • Books: BookID
  • Authors: AuthorID
  • Categories: CategoryID
  • Members: MemberID
  • BorrowRecords: BorrowID

Foreign Keys:

  • Books.AuthorID → Authors.AuthorID
  • Books.CategoryID → Categories.CategoryID
  • BorrowRecords.MemberID → Members.MemberID
  • BorrowRecords.BookID → Books.BookID

Relationships:

  • Authors → Books: 1:N (1 tác giả viết nhiều sách)
  • Categories → Books: 1:N (1 thể loại có nhiều sách)
  • Members → BorrowRecords: 1:N (1 thành viên mượn nhiều lần)
  • Books → BorrowRecords: 1:N (1 cuốn sách được mượn nhiều lần)

Exercise 3: Phát hiện vi phạm Normalization

Bảng sau vi phạm 1NF, 2NF hay 3NF? Đề xuất cách sửa.

EmpIDEmpNameSkillsDeptIDDeptNameDeptManager
1AnPython, SQL, Excel10ITBình
2CúcSQL, Tableau20AnalyticsDũng
3HoaPython, R10ITBình
💡 Xem đáp án

Vi phạm 1NF: Column "Skills" chứa nhiều giá trị (Python, SQL, Excel) → không atomic

Vi phạm 3NF: DeptName và DeptManager phụ thuộc vào DeptID, không phải EmpID (transitive dependency)

Cách sửa — tách thành 3 bảng:

SQL
1-- Table: Employees
2-- EmpID (PK), EmpName, DeptID (FK)
3
4-- Table: Departments
5-- DeptID (PK), DeptName, DeptManager
6
7-- Table: EmployeeSkills
8-- EmpID (FK), Skill
9-- PK: (EmpID, Skill)
10

📋 9. Tổng kết

TB5 min

Kiến thức nền tảng đã học

Chủ đềNội dung chínhTầm quan trọng
Database & RDBMSKho dữ liệu có tổ chức, quản lý bằng SQLNền tảng mọi thứ
Table/Row/ColumnCấu trúc lưu trữ cơ bảnPhải hiểu trước khi viết SQL
Data TypesINT, DECIMAL, NVARCHAR, DATE, BIT...Chọn sai → lỗi dữ liệu
Keys (PK, FK)Định danh và liên kết tablesXương sống của JOIN
ConstraintsNOT NULL, UNIQUE, CHECK, DEFAULTBảo vệ data integrity
Normalization1NF → 2NF → 3NFThiết kế database tốt
Schema & Data DictTổ chức và tài liệu hóa databaseHiểu trước khi viết query

Áp dụng vào khóa học

Từ bài tiếp theo, bạn sẽ:

  1. Cài đặt SQL Server và khám phá AdventureWorks database
  2. ✅ Đọc Data Dictionary của AdventureWorks trước khi viết queries
  3. ✅ Hiểu relationships giữa tables để viết JOINs đúng
  4. ✅ Biết data types để sử dụng functions phù hợp

Bài tiếp theo: Cài đặt SQL Server & Khám phá AdventureWorks

Câu hỏi tự kiểm tra

  1. Primary Key (PK) và Foreign Key (FK) khác nhau như thế nào? Vai trò của mỗi loại trong việc liên kết các bảng là gì?
  2. Ba mức chuẩn hóa (1NF, 2NF, 3NF) giải quyết những vấn đề gì? Trong thực tế, chuẩn hóa đến mức nào là đủ?
  3. Tại sao việc chọn đúng Data Type (INT, NVARCHAR, DECIMAL, DATE...) lại quan trọng khi thiết kế database?
  4. Schema trong SQL Server có vai trò gì? Tại sao nên dùng cú pháp Schema.TableName khi truy vấn?

🎉 Tuyệt vời! Bạn đã hoàn thành bài học Nền tảng Database!

Tiếp theo: Bạn sẽ cài đặt SQL Server và bắt đầu khám phá database AdventureWorks thực tế.