Thiết kế Database cho hệ thống
ERD
ERD (Entity-Relationship Diagram - Sơ đồ thực thể - mối quan hệ) là một mô hình trực quan giúp biểu diễn cấu trúc dữ liệu của hệ thống thông qua các thực thể (entities) và mối quan hệ (relationships) giữa chúng.
Sơ đồ ERD (dạng Crow’s Foot Notation) cho hệ thống:

Thực thể (Entity)
Trong sơ đồ trên, có thực thể (entities):
Students: Chứa thông tin sinh viên.Courses: Chứa thông tin về khóa học.Enrollments: Thực thể liên kết (associative entity) lưu trữ thông tin sinh viên đăng ký khóa học nào.
Mỗi thực thể có các thuộc tính (attributes):
- Students có
StudentID,Name,Birthdate. - Courses có
CourseID,Name,Description. - Enrollments có
EnrollmentID,StudentID,CourseID,EnrollmentDate.
Khóa chính (Primary Key - PK)
Mỗi bảng đều có một khóa chính để định danh duy nhất từng bản ghi:
StudentIDlà khóa chính của bảng Students.CourseIDlà khóa chính của bảng Courses.EnrollmentIDlà khóa chính của bảng Enrollments.
Khóa chính được ký hiệu bằng 🔑 trong sơ đồ.
Khóa ngoại (Foreign Key - FK)
Khóa ngoại ở bảng Enrollments thiết lập mối quan hệ đến các bảng khác:
StudentIDtham chiếu đến Students(StudentID).CourseIDtham chiếu đến Courses(CourseID).
Các khóa ngoại được biểu diễn bằng biểu tượng liên kết (🔗) trong sơ đồ.
Mối quan hệ (Relationship)
Mối quan hệ
1:N(One-to-Many - Một-nhiều) giữaStudentsvàEnrollments- Một sinh viên có thể đăng ký nhiều khóa học.
- Một bản ghi trong
Studentscó thể có nhiều bản ghi tương ứng trongEnrollments.
Mối quan hệ
1:N(One-to-Many - Một-nhiều) giữaCoursesvàEnrollments- Một khóa học có thể có nhiều sinh viên đăng ký.
- Một bản ghi trong
Coursescó thể có nhiều bản ghi tương ứng trongEnrollments.
Mối quan hệ
M:N(Many-to-Many - Nhiều-nhiều) giữaStudentsvàCourses- Một sinh viên có thể đăng ký nhiều khóa học.
- Một khóa học có thể có nhiều sinh viên.
- Cấu trúc này không thể biểu diễn trực tiếp, vì vậy ta sử dụng thực thể liên kết
Enrollmentsđể ánh xạ mối quan hệ.
Chú ý: Sinh viên có thể đăng ký cùng một khóa học nhiều lần vào nhiều thời điểm EnrollmentDate.
CREATE DATABASE
Trước tiên, ta cần tạo cơ sở dữ liệu để lưu trữ thông tin sinh viên, khóa học và đăng ký khóa học.
CREATE DATABASE StudentManagementSystem;
Lệnh trên sẽ tạo một cơ sở dữ liệu có tên StudentManagementSystem.
CREATE TABLE
Sau khi tạo xong cơ sở dữ liệu, ta cần tạo các bảng chính:
Students: Lưu thông tin sinh viên.Courses: Lưu thông tin các khóa học.Enrollments: Lưu thông tin đăng ký khóa học của sinh viên.
Bảng Students
StudentID: Khóa chính, tự động tăng (IDENTITY(1,1)).Name: Tên sinh viên, không được để trống.Birthdate: Ngày sinh của sinh viên.
CREATE TABLE Students (
StudentID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
Name NVARCHAR(50) NOT NULL,
Birthdate DATE
);
Bảng Courses
CourseID: Khóa chính.Name: Tên khóa học.Description: Mô tả khóa học.
CREATE TABLE Courses (
CourseID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
Name NVARCHAR(50) NOT NULL,
Description NVARCHAR(255) NOT NULL
);
Bảng Enrollments
EnrollmentID: Khóa chính.StudentID: Khóa ngoại tham chiếu đếnStudents.CourseID: Khóa ngoại tham chiếu đếnCourses.EnrollmentDate: Ngày đăng ký, mặc định là ngày hiện tại (GETDATE()).
CREATE TABLE Enrollments (
EnrollmentID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
StudentID INT NOT NULL,
CourseID INT NOT NULL,
EnrollmentDate DATE NOT NULL DEFAULT GETDATE(),
FOREIGN KEY (StudentID) REFERENCES Students(StudentID),
FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)
);
Database Diagrams
Database Diagrams (Sơ đồ cơ sở dữ liệu) là biểu đồ trực quan mô tả cấu trúc của cơ sở dữ liệu, bao gồm Các bảng (Tables), Các cột (Columns), Khóa chính (🔑 Primary Keys), Khóa ngoại (🔗 Foreign Keys), và Mối quan hệ giữa các bảng (Relationships) được tạo bởi SSMS.

Thêm dữ liệu
Thêm một số khóa học mẫu
INSERT INTO Courses (Name, Description)
VALUES (N'Toán học', N'Khóa học về toán học cơ bản và nâng cao'),
(N'Lập trình', N'Khóa học lập trình và thuật toán'),
(N'Tiếng Nhật', N'Khóa học tiếng Nhật từ sơ cấp đến trung cấp'),
(N'Tiếng Anh', N'Khóa học tiếng Anh giao tiếp');
Thêm một số sinh viên với ngày sinh cụ thể
INSERT INTO Students (Name, Birthdate)
VALUES (N'Trần Nhật Anh', '2002-01-01'),
(N'Phạm Thanh Hương', '2000-05-15'),
(N'Đặng Hoàng Nam', '2003-03-07'),
(N'Vũ Khánh Linh', '2005-11-25');
Thêm dữ liệu đăng ký khóa học
INSERT INTO Enrollments (StudentID, CourseID)
VALUES (1, 1),
(1, 2);
INSERT INTO Enrollments (StudentID, CourseID, EnrollmentDate)
VALUES (2, 3, '2025-01-01'),
(3, 4, '2025-02-28');
Giải thích
- Sinh viên (
StudentID = 1) đăng ký hai khóa: (CourseID = 1) và (CourseID = 2). - Sinh viên (
StudentID = 2) đăng ký khóa (CourseID = 3) vào ngày 01/01/2025. - Sinh viên (
StudentID = 3) đăng ký khóa (CourseID = 4) vào ngày 28/02/2025.
Câu lệnh reset lại Database
Chúng ta có thể sử dụng câu lệnh sau để đặt lại Database StudentManagementSystem về trạng thái ban đầu:
USE master;
GO
-- Đóng tất cả kết nối tới database
ALTER DATABASE StudentManagementSystem SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- Xóa database nếu tồn tại
DROP DATABASE StudentManagementSystem;
GO
-- Tạo lại database
CREATE DATABASE StudentManagementSystem;
GO
USE StudentManagementSystem;
GO
CREATE TABLE Students (
StudentID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
Name NVARCHAR(50) NOT NULL,
Birthdate DATE
);
CREATE TABLE Courses (
CourseID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
Name NVARCHAR(50) NOT NULL,
Description NVARCHAR(255) NOT NULL
);
CREATE TABLE Enrollments (
EnrollmentID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
StudentID INT NOT NULL,
CourseID INT NOT NULL,
EnrollmentDate DATE NOT NULL DEFAULT GETDATE(),
FOREIGN KEY (StudentID) REFERENCES Students(StudentID),
FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)
);
INSERT INTO Courses (Name, Description)
VALUES (N'Toán học', N'Khóa học về toán học cơ bản và nâng cao'),
(N'Lập trình', N'Khóa học lập trình và thuật toán'),
(N'Tiếng Nhật', N'Khóa học tiếng Nhật từ sơ cấp đến trung cấp'),
(N'Tiếng Anh', N'Khóa học tiếng Anh giao tiếp');
INSERT INTO Students (Name, Birthdate)
VALUES (N'Trần Nhật Anh', '2002-01-01'),
(N'Phạm Thanh Hương', '2000-05-15'),
(N'Đặng Hoàng Nam', '2003-03-07'),
(N'Vũ Khánh Linh', '2005-11-25');
INSERT INTO Enrollments (StudentID, CourseID)
VALUES (1, 1),
(1, 2);
INSERT INTO Enrollments (StudentID, CourseID, EnrollmentDate)
VALUES (2, 3, '2025-01-01'),
(3, 4, '2025-02-28');
Tổng kết
- ERD, Database Diagrams giúp trực quan hóa cấu trúc cơ sở dữ liệu.
CREATE DATABASE: Tạo cơ sở dữ liệu mới.CREATE TABLE: Xây dựng bảng với các cột và ràng buộc.INSERT INTO: Chèn dữ liệu vào bảng.- Khóa chính (
Primary Key) đảm bảo tính duy nhất của mỗi bản ghi. - Khóa ngoại (
Foreign Key) tạo liên kết giữa các bảng.
Chúng ta sẽ tìm hiểu sâu hơn về các kiến thức đã xuất hiện như kiểu dữ liệu, ràng buộc dữ liệu, hàm... trong các bài sau.
