Skip to main content

1. Lý thuyết

Tổng quan về Normalization

Chuẩn hóa CSDL (Cơ sở dữ liệu) là quá trình tổ chức và thiết kế cơ sở dữ liệu một cách chính xác và hiệu quả. Mục tiêu của chuẩn hóa CSDL là loại bỏ các sự không chắc chắn, mâu thuẫn và lặp lại trong dữ liệu để đảm bảo tính nhất quán và độ tin cậy của cơ sở dữ liệu.

Chuẩn hóa CSDL giúp đảm bảo rằng dữ liệu trong cơ sở dữ liệu được lưu trữ và quản lý một cách hiệu quả, giảm thiểu sự mâu thuẫn, và tránh tình trạng dư thừa thông tin. Nó đảm bảo rằng mỗi mục dữ liệu chỉ được lưu trữ ở một nơi duy nhất, giúp tránh việc cập nhật dữ liệu không nhất quán và tăng tính nhất quán của cơ sở dữ liệu.

Quá trình chuẩn hóa CSDL thường bao gồm các bước sau:

Phân tích yêu cầu: Xác định yêu cầu của hệ thống và thu thập thông tin về dữ liệu cần được lưu trữ trong cơ sở dữ liệu.

Thiết kế lược đồ ER (Entity-Relationship): Sử dụng mô hình ER để biểu diễn các thực thể, mối quan hệ giữa chúng và các thuộc tính.

Chuẩn hóa bậc 1 (First Normal Form): Đảm bảo rằng mỗi ô trong bảng chỉ chứa giá trị đơn lẻ và không lặp lại.

Chuẩn hóa bậc 2 (Second Normal Form): Xác định và tách các bảng con chứa thuộc tính phụ thuộc vào một khóa không chính.

Chuẩn hóa bậc 3 (Third Normal Form): Đảm bảo rằng không có sự phụ thuộc dựa trên các thuộc tính không khóa.

Ngoài ra, còn có các bậc chuẩn hóa tiếp theo như bậc 4, bậc 5 và dạng chuẩn hóa cao hơn như Boyce-Codd Normal Form (BCNF) hoặc Fourth Normal Form (4NF). Quá trình chuẩn hóa CSDL có thể tùy chỉnh tùy theo yêu cầu và phức tạp của cơ sở dữ liệu cụ thể.

Xét ví dụ (Normalization)

EmployeeIdProjectIdProjectNameEmployeeNameGradeSalary
142113, 124BLUE STAR, MAGNUMJohnA20,000
168113BLUE STARJamesB15,000
263113BLUE STARAndrewC10,000
109124MAGNUMBobC10,000

Bảng trên bao gồm các điểm dị thường sau:

  • Insertion Anomaly
  • Deletion Anomaly
  • Updation Anomaly
  • Redundancy / Duplication / Repetition

Điểm dị thường về REPEATION

  • Cột "ProjectId" và "ProjectName" trong bảng trên chứa các giá trị lặp lại. Ví dụ, dự án có "ProjectId" là 113 và 124 có tên là "BLUE STAR, MAGNUM". Điều này dẫn đến sự lặp lại dữ liệu trong bảng.
  • Cột "Grade" tương ứng với Salary trong bảng trên cũng chứa các giá trị lặp lại. Ví dụ, nhân viên có "EmployeeId" là 109 và 263 đều có "Grade" là C và đều là 10,000. Điều này dẫn đến sự lặp lại dữ liệu trong bảng.

Điểm dị thường về INSERTION

  • Cột "ProjectId" trong hàng đầu tiên có giá trị "113, 124". Điều này chỉ ra rằng một nhân viên có thể tham gia vào nhiều dự án (113 và 124). Tuy nhiên, trong các hàng tiếp theo, cột "ProjectId" chỉ chứa một giá trị duy nhất cho mỗi hàng. Điều này tạo ra sự không nhất quán trong dữ liệu khi INSERT vào bảng.
  • Cột "ProjectName" trong hàng đầu tiên có giá trị "BLUE STAR, MAGNUM", chỉ ra rằng dự án này có tên gồm hai phần "BLUE STAR" và "MAGNUM". Tuy nhiên, trong các hàng tiếp theo, cột "ProjectName" chỉ chứa một tên dự án duy nhất cho mỗi hàng. Điều này cũng tạo ra sự không nhất quán trong dữ liệu khi INSERT vào bảng.
LƯU Ý

Điểm dị thường INSERTION trên liên quan đến việc chèn (INSERT) dữ liệu vào bảng, khi các giá trị của cột "ProjectId" và "ProjectName" không được đồng nhất cho các hàng tương ứng. Điều này cần được sửa chữa để đảm bảo tính nhất quán và chuẩn hóa dữ liệu trong cơ sở dữ liệu.

Điểm dị thường về DELETION

  • Nếu bạn muốn xóa thông tin về một dự án cụ thể, ví dụ như dự án có "ProjectId" là 113, việc xóa dự án này sẽ không chỉ xóa hàng chứa dự án này mà còn ảnh hưởng đến các hàng khác. Ví dụ, nếu bạn xóa hàng chứa dự án có "ProjectId" là 113, thì hàng của nhân viên James và Andrew cũng sẽ bị xóa vì cả hai nhân viên này đều tham gia dự án 113. Điều này gây ra sự không nhất quán và mất mát dữ liệu trong bảng.
  • Nếu bạn muốn xóa thông tin về một nhân viên cụ thể, việc xóa nhân viên này cũng sẽ ảnh hưởng đến các hàng khác. Ví dụ, nếu bạn xóa hàng chứa thông tin về nhân viên James, thì hàng của dự án có "ProjectId" là 113 cũng sẽ bị xóa vì nhân viên James tham gia dự án 113. Điều này cũng dẫn đến sự không nhất quán và mất mát dữ liệu trong bảng.
LƯU Ý

Điểm dị thường DELETION trên liên quan đến việc xóa dữ liệu trong bảng, khi việc xóa một hàng có thể ảnh hưởng đến các hàng khác trong bảng. Điều này cần được xử lý một cách thích hợp để đảm bảo tính nhất quán và bảo toàn dữ liệu trong cơ sở dữ liệu.

Điểm dị thường về UPDATION

  • Cột "ProjectId": Điểm dị thường ở đây là cập nhật giá trị của cột "ProjectId" trong một hàng. Vì cột "ProjectId" trong bảng ghi đầu tiên chứa giá trị "113, 124", việc cập nhật giá trị này thành một giá trị duy nhất sẽ gây ra sự không nhất quán trong dữ liệu. Nếu chỉ cập nhật "ProjectId" thành một giá trị duy nhất, ví dụ như 113 hoặc 124, thì thông tin về việc nhân viên tham gia vào nhiều dự án sẽ bị mất.
  • Cột "ProjectName": Điểm dị thường ở đây là cập nhật giá trị của cột "ProjectName" trong một hàng. Vì cột "ProjectName" trong bảng ghi đầu tiên chứa giá trị "BLUE STAR, MAGNUM", việc cập nhật giá trị này thành một tên dự án duy nhất sẽ gây ra sự không nhất quán trong dữ liệu. Nếu chỉ cập nhật "ProjectName" thành một tên dự án duy nhất, ví dụ như "BLUE STAR" hoặc "MAGNUM", thì thông tin về việc một dự án có nhiều tên sẽ bị mất.
LƯU Ý

Điểm dị thường UPDATION trên liên quan đến việc cập nhật dữ liệu trong bảng, khi cập nhật giá trị của các cột "ProjectId" và "ProjectName" có thể gây ra sự không nhất quán và mất mát thông tin trong dữ liệu. Điều này cần được xử lý một cách cẩn thận để đảm bảo tính nhất quán và bảo toàn dữ liệu trong cơ sở dữ liệu.

First Normal Form (1NF)

  • Để đảm bảo tính nhất quán và chuẩn hóa dữ liệu trong cơ sở dữ liệu, các điểm dị thường INSERTION, DELETION và UPDATION cần được xử lý một cách thích hợp. Để làm được điều này, bảng cần được chuyển đổi thành First Normal Form (1NF).

  • Để đạt được 1NF, bảng cần thỏa mãn các điều kiện sau:

    • Các giá trị trong mỗi cột phải là giá trị đơn (Atomic value) và cùng một kiểu dữ liệu (Data type).
    • Cột không có sự lặp lại: Trong mỗi bảng, không có cột nào được lặp lại. Tức là mỗi thuộc tính chỉ xuất hiện một lần trong một bảng.
  • Cách làm như sau:

    • Để chuyển bảng dữ liệu trên sang dạng chuẩn 1NF (First Normal Form), ta cần tách các giá trị trong cột ProjectIdProjectName thành các hàng riêng biệt. Khi đó, mỗi hàng sẽ chỉ chứa các giá trị nguyên tử (atomic values) và không có sự lặp lại nhóm dữ liệu.

Bảng Employees

EmployeeIdProjectIdProject NameEmployeeNameGradeSalary
142113BLUE STARJohnA20,000
142124MAGNUMJohnA20,000
168113BLUE STARJamesB15,000
263113BLUE STARAndrewC10,000
109124MAGNUMBobC10,000

Second Normal Form (2NF)

  • Để đạt được 2NF, bảng cần thỏa mãn các điều kiện sau:

    • Cần đạt được 1NF.
    • Các cột không phải là khóa chính (non-key columns) phải phụ thuộc vào toàn bộ khóa chính (entire primary key).
    • Xây dựng mối quan hệ giữa các bảng (Primary Key <-> Foreign Key).
  • Cách làm như sau:

    • Tách bảng Employees thành hai bảng EmployeesProjects.
    • Tạo bảng mới có tên là Employees_Projects với các cột: EmployeeIdProjectId.
    • Trong bảng Employees_Projects, cả hai cột EmployeeId và ProjectId tham gia cùng làm 1 khóa chính (primary key) để định danh mỗi bảng ghi là duy nhất.
    • Xóa cột ProjectId trong bảng Employees (Vì đã có bảng Employees_Projects và đã mối liên hệ dữ liệu giữa Employees <-> Projects).
    • Thiết lập khóa chính cho bảng Employees là cột EmployeeId.
    • Tạo mối quan hệ giữa bảng Employees và bảng Employees_Projects thông qua cột EmployeeId.
    • Tạo mối quan hệ giữa bảng Projects và bảng Employees_Projects thông qua cột ProjectId.

Bảng Employees_Projects

EmployeeIdProjectId
142113
142124
168113
263113
109124

Bảng Projects

ProjectIdProjectName
113BLUE STAR
124MAGNUM

Bảng Employees

EmployeeIdEmployeeNameGradeSalary
142JohnA20,000
168JamesB15,000
263AndrewC10,000
109BobC10,000

Third Normal Form (3NF)

  • Để đạt được 3NF, bảng cần thỏa mãn các điều kiện sau:

    • Cần đạt được 2NF.
    • Loại bỏ các phụ thuộc trực tiếp không cần thiết.
    • Tách các thuộc tính phụ thuộc vào nhau thành các bảng riêng biệt.
    • Tất cả các thuộc tính không khóa trong 3NF được yêu cầu là phải phụ thuộc trực tiếp vào mỗi khóa của quan hệ.
  • Cách làm như sau:

    • Tạo bảng Grade với các cột: GradeSalary.
    • Trong bảng Grade, cột Grade sẽ là khóa chính (primary key) để định danh mỗi bản ghi là duy nhất.
    • Xóa cột Salary trong bảng Employees.
    • Tạo mối quan hệ giữa bảng Employees và bảng Grade thông qua cột Grade.

Bảng Grade

GradeSalary
A20,000
B15,000
C10,000

Bảng Employees

EmployeeIdEmployeeNameGrade
142JohnA
168JamesB
263AndrewC
109BobC

Bảng Projects

ProjectIdProjectName
113BLUE STAR
124MAGNUM

Bảng Employees_Projects

EmployeeIdProjectId
142113
142124
168113
263113
109124

Entity-Relationship Diagram (ERD)

ERD (Entity-Relationship Diagram) là một công cụ được sử dụng để biểu diễn mô hình dữ liệu trong quá trình thiết kế cơ sở dữ liệu. Trong ERD, có một số ký hiệu chính được sử dụng để biểu diễn các thành phần và mối quan hệ trong mô hình. Dưới đây là một số ký hiệu phổ biến trong vẽ ERD:

  • Thực thể (Entity): Được biểu diễn bằng hình vuông hoặc hình chữ nhật. Thực thể đại diện cho một đối tượng trong thế giới thực, ví dụ như "Khách hàng" hoặc "Sản phẩm". Tên của thực thể được đặt bên trong hình vuông hoặc hình chữ nhật.

  • Thực thể (Weak Entity): Được biểu diễn bằng hình vuông hoặc hình chữ nhật với các đường nét đứt. Thực thể yếu là một thực thể không thể tồn tại một mình mà phải tồn tại dựa trên một thực thể khác.

    • Ví dụ:
      • Thực thể "Dòng sản phẩm" (Product Line):
        • Thực thể "Dòng sản phẩm" không thể tồn tại độc lập mà phải phụ thuộc vào thực thể "Sản phẩm" (Product).
        • Mỗi dòng sản phẩm thuộc về một sản phẩm cụ thể. Nếu sản phẩm không tồn tại, thì dòng sản phẩm cũng không thể tồn tại.
      • Thực thể "Chi tiết hóa đơn" (Invoice Detail):
        • Thực thể "Chi tiết hóa đơn" không thể tồn tại độc lập mà phải gắn liền với thực thể "Hóa đơn" (Invoice).
        • Mỗi chi tiết hóa đơn thuộc về một hóa đơn cụ thể. Nếu hóa đơn bị xóa, thì các chi tiết của hóa đơn đó cũng bị xóa theo.
      • Thực thể "Bình luận" (Comment) trong hệ thống blog:
        • Thực thể "Bình luận" không thể tồn tại độc lập mà phải gắn liền với thực thể "Bài viết" (Post).
        • Mỗi bình luận thuộc về một bài viết cụ thể. Nếu bài viết bị xóa, thì các bình luận liên quan cũng sẽ bị xóa theo.
  • Mối quan hệ (Relationship): Được biểu diễn bằng đường thẳng kết nối giữa các thực thể. Mỗi mối quan hệ có một tên để mô tả mối liên kết giữa các thực thể. Thông thường, mối quan hệ có thể là "One-to-One" (1-1), "One-to-Many" (1-N), hoặc "Many-to-Many" (N-N).

  • Thuộc tính (Attribute): Được biểu diễn bằng hình tròn hoặc hình oval. Thuộc tính là thông tin cụ thể về một thực thể, ví dụ như "Mã số" hoặc "Tên". Thuộc tính được liệt kê bên trong hình tròn hoặc hình oval và được kết nối với thực thể tương ứng bằng đường thẳng.

    • Thuộc tính đơn (Simple Attribute): Được biểu diễn bằng hình tròn hoặc hình oval (1 nét). Thuộc tính đơn là thuộc tính không thể chia nhỏ được.
    • Thuộc tính phức (Composite Attribute): Được biểu diễn bằng hình tròn hoặc hình oval (2 nét). Thuộc tính phức là thuộc tính có thể chia nhỏ được thành các thuộc tính đơn.
  • Khóa chính: Được biểu diễn bằng dấu gạch ngang chân dưới thuộc tính. Khóa định danh một thực thể duy nhất trong mô hình. Nó có thể là khóa chính (Primary Key) hoặc khóa ngoại (Foreign Key).

  • Khóa ngoại: Được biểu diễn bằng ký hiệu (FK) sau thuộc tính. Khóa ngoại là thuộc tính tham chiếu đến khóa chính (primary key) của một thực thể khác.

Một số ký hiệu khác:

  • Ký hiệu "1" và "N" được sử dụng để biểu thị mối quan hệ "One-to-Many".
  • Ký hiệu "0..1" và "0..N" được sử dụng để biểu thị mối quan hệ tùy chọn.
  • Ký hiệu "PK" và "FK" cũng được sử dụng để biểu thị khóa chính và khóa ngoại (trong một số kiểu vẽ khác).

Lưu ý rằng có nhiều ký hiệu và biến thể khác nhau trong vẽ ERD, và chúng có thể khác nhau tùy thuộc vào ngữ cảnh và công cụ được sử dụng. Tuy nhiên, những ký hiệu và biểu đồ phổ biến nhất được sử dụng trong ERD đã được trình bày ở trên. Bên cạnh các ký hiệu này, còn có một số ký hiệu bổ sung mà bạn có thể gặp trong vẽ ERD:

  • Mối quan hệ mạnh (Strong Relationship): Được biểu diễn bằng một đường thẳng kép. Mối quan hệ mạnh xảy ra khi một thực thể phụ thuộc hoàn toàn vào một thực thể khác, và không tồn tại mà không có thực thể gốc.

  • Mối quan hệ yếu (Weak Relationship): Được biểu diễn bằng một đường thẳng kép, trong đó một đường thẳng được đánh dấu bằng một dấu gạch chéo. Mối quan hệ yếu xảy ra khi một thực thể phụ thuộc vào một thực thể khác, nhưng cũng có thể tồn tại mà không có thực thể gốc.

  • Ký hiệu kết thúc (Cardinality): Sử dụng các ký hiệu "0" hoặc "1" để biểu diễn số lượng tối thiểu và "N" để biểu diễn số lượng tối đa trong mối quan hệ. Ví dụ, "0..1" biểu thị một mối quan hệ tùy chọn trong đó có thể có hoặc không có sự kết nối, trong khi "0..N" biểu thị một mối quan hệ tùy chọn và có thể có nhiều kết nối.

Lưu ý

Nhớ rằng việc sử dụng các ký hiệu và biểu đồ ERD cụ thể có thể khác nhau tùy thuộc vào ngữ cảnh và các công cụ thiết kế cơ sở dữ liệu khác nhau. Tuy nhiên, các ký hiệu và biểu đồ trên cung cấp một nền tảng chung để biểu diễn mô hình dữ liệu trong ERD.

tip

Sử dụng công cụ: https://excalidraw.com để vẽ ERD