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)mối quan hệ (relationships) giữa chúng.

Sơ đồ ERD (dạng Crow’s Foot Notation) cho hệ thống:

Database Diagrams


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):

  • StudentsStudentID, Name, Birthdate.
  • CoursesCourseID, Name, Description.
  • EnrollmentsEnrollmentID, 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:

  • StudentID là khóa chính của bảng Students.
  • CourseID là khóa chính của bảng Courses.
  • EnrollmentID là 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:

  • StudentID tham chiếu đến Students(StudentID).
  • CourseID tham 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ữa StudentsEnrollments

    • Một sinh viên có thể đăng ký nhiều khóa học.
    • Một bản ghi trong Students có thể có nhiều bản ghi tương ứng trong Enrollments.
  • Mối quan hệ 1:N (One-to-Many - Một-nhiều) giữa CoursesEnrollments

    • Một khóa học có thể có nhiều sinh viên đăng ký.
    • Một bản ghi trong Courses có thể có nhiều bản ghi tương ứng trong Enrollments.
  • Mối quan hệ M:N (Many-to-Many - Nhiều-nhiều) giữa StudentsCourses

    • 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 đến Students.
  • CourseID: Khóa ngoại tham chiếu đến Courses.
  • 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.

Database Diagrams

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.