Các loại chuẩn hoá trong CSDL Quan hệ

Cùng LPTECH tìm hiểu các loại chuẩn hoá trong CSDL Quan hệ quan trọng cho việc thiết kế cơ sở dữ liệu trong Thiết kế website. Đó là các chuẩn hóa cơ sở dữ liệu quan hệ. Thông thường, chủ đề này mang tính học thuật do vậy phù hợp hơn ở trung tâm, viện nghiên cứu. Tuy nhiên, việc hiểu biết những nguyên lý cơ bản của chuẩn hóa cơ sở dữ liệu và áp dụng chúng vào công việc thiết kế cơ sỡ dữ liệu hàng ngày mà chúng ta phải làm thực sự là không phức tạp mà còn giúp cải thiện hiệu năng hoạt động của cơ sở dữ liệu.

Cơ sở dữ liệu quan hệ là gì ?

RDBMS - Relational Database Management System là hệ quản trị cơ sở dữ liệu quan hệ được giới thiệu bởi E.F.Codd.

RDBMS là mô hình cơ bản cho ngôn ngữ SQL và cho tất cả các cơ sở dữ liệu hư MS SQL Server, IBM Server, IBM DB2, Oracle, MySQL và Microsoft Access

Chuẩn hóa CSDL là gì ?

Chuẩn hóa CSDL là để giúp cho việc tổ chức dữ liệu trong cơ sở dữ liệu một cách hiệu quả. Có hai mục đích chính để chuẩn hóa dữ liệu:

  1. Giảm lượng dữ liệu dư thừa (ví dụ như lưu trữ cùng một dữ liệu trong 1 bảng)
  2. Đảm bảo độc lập dữ liệu (dữ liệu liên quan đặt trong cùng 1 bảng) Cả 2 mục đích trên đều giúp giảm thiểu không gian sử dụng trong cơ sở dữ liệu và đảm bảo dữ liệu được lưu trữ một cách logic.

Các Chuẩn thông thường

Cộng đồng những người phát triển cở sở dữ liệu đã đưa ra 5 chuẩn được đánh số từ 1 (chuẩn 1 hoặc 1NF-Normal form) đến 5 (chuẩn 5 hoặc 5NF). Trong thực tế làm việc, chúng ta sẽ thường xuyên gặp 1NF, 2NF, 3NF và 4NF. Tuy nhiên, chuẩn 5 gần như là không gặp nên sẽ không bàn luận trong bài viết này.

Ngay bây giờ hãy cùng LPTech tìm hiểu qua các loại chuẩn hoá CSDL Quan hệ Phổ biến nào.

Chuẩn 1Normal Form - 1NF

Chuẩn 1 hay gọi tắt là 1NF là tập hợp các quy định cơ bản để tổ chức cơ sở dữ liệu như sau:

  1. Giảm cột dữ liệu dư thừa từ cùng 1 bảng
  2. Tạo các bảng riêng biệt cho mỗi nhóm dữ liệu liên quan đến nhau và định nghĩa mỗi dòng với một cột duy nhất (gọi là primary key) Để thỏa mãn các tiêu chí của chuẩn 1 chúng ta phải không được để trùng lặp các giá trị trong dòng của bảng. Nguyên lý này được gọi là nguyên tử hóa bảng (atomicity of table)và bảng như này gọi là bảng nguyên tử. Để hiểu hơn về chuẩn 1 chúng ta xem xét ví dụ sau: bảng quản lý nhân sự lưu trữ quan hệ giữa quản lý và nhân viên. Để hiểu rõ hơn về chuẩn hóa 1 chúng ta có quy tắc sau mỗi quản lý có một hoặc nhiều nhân viên nhưng mỗi nhân viên chỉ có duy nhất một quản lý.

Khi tạo bảng tính cho việc quản lý trên, chúng ta tạo một bảng có các cột sau:

- Manager
- Subordiante 1
- Subordiante 2
- Subordiante 3
- Subordiante 4

Tuy nhiên, khi áp chuẩn 1 vào chúng ta cần loại bỏ cột dữ liệu lặp trong cùng 1 bảng. Cụ thể trong trường hợp này, cột nhân viên 1,2,3,4 bị lặp lại. Nếu quản lý có 1 nhân viên thì cột nhân viên 2,3,4 sẽ thừa và như vậy gây lãng phí không gian lưu trữ. Hơn nữa, quản lý có 4 nhân viên rồi thì chuyện gì xảy ra khi có thêm nhân viên mới? Cấu trúc bảng lúc này sẽ phải chỉnh lại. Thay đổi cấu trúc bảng như sau:

- Manager
- Subordinates

Vì vậy, chúng ta không cần có nhiều cột nhân viên nữa mà sẽ chỉ còn 2 cột quản lý và nhân viên. Tuy nhiên, cột nhân viên lúc này có nhiều giá trị như “A,B,C”. Giải pháp này cũng ko được vì cột nhân viên vẫn có lặp dữ liệu và không duy nhất (non-atomic). Chuyện gì xảy ra khi chúng ta muốn thêm hoặc loại bỏ 1 nhân viên. Chúng ta sẽ phải đọc và ghi lại nội dung của cột đó. Nó sẽ không là vấn đề nếu như quản lý có ít nhân viên, nhưng nếu quản lý có hàng trăm nhân viên thì điều này là phức tạp cho việc xử lý truy vấn dữ liệu.

Hướng tiếp cận khác, cột nhân viên sẽ là duy nhất một giá trị, tuy nhiên cột quản lý sẽ có nhiều giá trị.

- Manager
- Subordinate

Bây giờ, vấn đề sẽ là tìm ra cột làm khóa chính. Với hướng tiếp cận như này thì cột nhân viên sẽ là khóa chính. Trong thực tế, lựa chọn trên có vẻ hợp lý khi mà mỗi nhân viên chỉ có duy nhất một quản lý. Tuy nhiên, chuyện gì sẽ xảy ra khi chúng ta thuê một nhân viên tên Nguyen Van A và chúng ta đã lưu trữ quan hệ của người này rồi.

Cách tốt nhất là sử dụng mã số duy nhất(employee ID) cho nhân viên làm khóa chính. Và bảng cuối cùng của chúng ta sẽ trông như sau:

- Manager ID
- Subordinate ID

Chuẩn 2Normal Form - 2NF

Chuẩn 2NF sẽ giúp các lập trình viên loại bỏ các giá trị trùng lặp. Khi thiết kế cơ cơ sở dữ liệu cho KH cần chú ý đến việc trùng lặp, hãy áp dụng chuẩn 2NF nhé:

  1. Bao gồm toàn bộ yêu cầu của chuẩn1.
  2. Xóa bỏ tập con dữ liệu trong nhiều hảng của 1 bảng và đặt chúng vào các bảng riêng biệt.
  3. Tạo quan hệ giữa các bảng mới thông qua sử dụng khóa ngoại (foreign keys)

Để hiểu rõ hơn chúng ta cùng tìm hiểu ví dụ sau:  Bảng lưu trữ thông tin khách hàng của một shop online. Chúng ta có một bảng đơn gọi là Customers có các cột sau:

- CustNum
- FirstName
- LastName
- Address
- City
- State
- ZIP

Có một sự dư thừa nhỏ là chúng ta đang lưu trữ “Sea Cliff, NY 11579” and “Miami, FL 33157” 2 lần cho mỗi dòng. Điều này có thể không ảnh hưởng quá nhiều cho không gian lưu trữ nhưng nếu chúng ta ko hàng trăm trường hợp như vậy thì sẽ rất lãng phí không gian lưu trữ. Ngoài ra, nếu ZIP code cho Sea Cliff có bị thay đổi thì chúng ta cần thay đổi cho rất nhiều chỗ trong cơ sở dữ liệu.

Trong chuẩn 2, việc làm giảm thông tin dư thừa là tách ra và lưu trữ vào các bảng riêng biệt. Bảng mới của chúng có (gọi là bảng ZIPs) có những cột sau:

- ZIP
- City
- State

Như vậy, chúng ta sẽ loại bỏ được giá trị trùng lặp trong bảng Customers. Đấy là tiêu chí đầu tiên của chuẩn 1 đã được thỏa mãn. Chúng ta vẫn cần sử dụng khóa ngoại để nối 2 bảng lại với nhau. Chúng ta sử dụng ZIP code (khóa chính cho bảng ZIPs) để tạo quan hệ. Và đây là bảng Customers mới:


- CustNum
- FirstName
- LastName
- Address
- ZIP

Như vậy chúng ta đã làm giảm thiểu tối đa việc lặp thông tin và cấu trúc lại bảng theo chuẩn 2.

Chuẩn 3Normal Form - 3NF

Chuẩn 3 Normal Form sẽ áp dụng một số tiêu chí sau để đảm bảo tính tối ưu nhất của CSDL:

  1. Bao gồm tất cả yêu cầu của chuẩn 1 và chuẩn 2.
  2. Xóa bỏ những cột không phụ thuộc vào khóa chính

Để hiểu rõ hơn chúng ta xem xét ví dụ sau: Chúng ta có bảng orders bao gồm các thuộc tính sau:

- Order Number
- Customer Number
- Unit Price
- Quantity
- Total

Chú ý, điều đầu tiên là bảng của chúng ta cần phải thỏa mãn chuẩn 1NF, 2 NF. Có sự lặp cột dữ liệu không? - Không. Có khóa chính chưa ? - Có rồi, chính là cột order number. Do đó, bảng này thỏa mãn 1NF. Có tập con dữ liệu trong nhiều dòng ko ? - Không, vì thế bảng này cũng thỏa mãn 2NF.

Bây giờ, chúng ta cùng xem tất cả cột có phụ thuộc vào khóa chính không? Qua bảng trên chúng ta thấy cột total được xác định bằng unit price nhân với quantity. Do vậy cột này không phụ thuộc vào khóa chính. Và bảng của chúng ta lúc này chỉ sử dụng các thuộc tính sau:

- Order Number
- Customer Number
- Unit Price
- Quantity

Và bây giờ bảng của chúng ta đã thỏa mãn chuẩn 3NF. Và total lúc này không được lưu trữ trong cơ sở dữ liệu và được tính trực tiếp khi chúng ta truy vấn.

SELECT OrderNumber, UnitPrice*Quantity AS Total FROM Orders

Chuẩn 4 (4NF)

Cuối cùng, chuẩn 4 (4NF) có thêm một số yêu cầu sau:

  1. Tất cả yêu cầu của chuẩn 3
  2. Một quan hệ là chuẩn 4 nếu nó không có phụ thuộc nhiều giá trị Chú ý, các chuẩn hóa trên có tích chất tích lũy. Vì vậy, cơ sở dữ liệu đã đạt chuẩn 2 thì nó phải đạt đầy đủ tiêu chí của chuẩn 1.

Chuẩn Boyce-Codd (BCNF hoặc 3.5NF)

Chuẩn Boyce-Codd bao gồm các yêu cầu sau:

  1. Toàn bộ yêu cầu của chuẩn 3
  2. Mọi sự xác định phải là khóa ứng viên (candidate key) Ví dụ: bảng lưu thông tin của nhân viên có các thuộc tính sau: employee_id, first_name, last_name, title. Trong bảng này, cột emloyee_id giúp xác định first_name và last_name. Tương tự, cặp (first_name, last_name) cũng sẽ xác định được employee_id

Tóm lại, Các đơn vị thiết kế website hoặc các bạn đang là lập trình viên hãy luôn nhớ các tiêu chuẩn trên để áp dụng triệt để vào dự án của mình. Đem lại hiệu quả tốt nhất và chất lượng dự án cao. CSDL rất quan trọng nên việc thiết kế cơ sở dữ liệu quan hệ chiếm đến 50% chất lượng toàn dự án.

Thông tin liên hệ

Nếu bạn có thắc mắc gì, có thể gửi yêu cầu cho chúng tôi, và chúng tôi sẽ liên lạc lại với bạn sớm nhất có thể .

Công ty TNHH TMĐT Công nghệ LP

Giấy phép kinh doanh số 0315561312/GP bởi Sở Kế Hoạch và Đầu Tư TP. Hồ Chí Minh.

Văn phòng: Lầu 4, Toà nhà Lê Trí, 164 Phan Văn Trị, Phường 12,Quận Bình Thạnh, HCMC

Hotline: 0338 586 864

Mail: sales@lptech.asia

Zalo:LP Tech Zalo Official

Liên hệ qua Zalo: 0338586864 ( hoặc bấm vào link này: http://lptech.asia/zalo-lptech). Hoặc nhập thông tin mà bạn cần hỗ trợ vào ô liên hệ bên dưới để lên lạc với LPTech nhé.

Bài viết cùng chuyên mục

Hibernate ORM là gì? Khi nào nên dùng hibernate...

Hibernate ORM là một khung làm việc mã nguồn mở hoạt động như một tầng trung gian giữa ứng dụng và cơ sở dữ liệutrong Java dùng để ánh...

cURL là gì? Các câu lệnh cơ bản để sử dụng cURL

cURL là công cụ mạnh mẽ giúp bạn gửi và nhận dữ liệu qua nhiều giao thức khác nhau. Tìm hiểu chi tiết về cURL và các tính năng, giao thức...

CQRS Pattern là gì? Design pattern chuyên tách...

Tìm hiểu thông tin chi tiết về CQRS Pattern. CQRS (Command Query Responsibility Segregation) là một pattern giúp tách biệt command và...

Bool là gì? Tìm hiểu về kiểu dữ liệu bool trong...

Boolean là một kiểu dữ liệu cơ bản trong lập trình với C/C++, Jav,... Bool dùng để biểu diễn các giá trị logic đúng (true) hoặc sai...

Unit Test là gì? Tìm hiểu về khái niệm kiểm thử...

Unit Test sẽ giúp người dùng có thể xây dựng dự án một cách hiệu quả, để biết được những thông tin hữu ích về Unit Test. Hãy theo dõi...

Middleware là gì? Tầm quan trọng của middleware...

Middleware là một đoạn mã trung gian nằm trong các ứng dụng web được thiết kế trên mô hình client-server. Tìm hiểu middleware là gì và...

Bài viết mới nhất


Hibernate ORM là gì? Khi nào nên dùng hibernate...

Hibernate ORM là một khung làm việc mã nguồn mở hoạt động như một tầng trung gian giữa ứng dụng và cơ sở dữ liệutrong Java dùng để ánh xạ các đối...

cURL là gì? Các câu lệnh cơ bản để sử dụng cURL

cURL là công cụ mạnh mẽ giúp bạn gửi và nhận dữ liệu qua nhiều giao thức khác nhau. Tìm hiểu chi tiết về cURL và các tính năng, giao thức mà nó hỗ...

CQRS Pattern là gì? Design pattern chuyên tách...

Tìm hiểu thông tin chi tiết về CQRS Pattern. CQRS (Command Query Responsibility Segregation) là một pattern giúp tách biệt command và query cực...

Chúc mừng sinh nhật Sếp Phú

Một hành trình mới bắt đầu cùng nhiều thử thách mới. Với sự tự tin, kiên cường và bản lĩnh, LPTech tin chắc rằng Sếp Phú của LPTech sẽ có nhiều...

Bool là gì? Tìm hiểu về kiểu dữ liệu bool trong...

Boolean là một kiểu dữ liệu cơ bản trong lập trình với C/C++, Jav,... Bool dùng để biểu diễn các giá trị logic đúng (true) hoặc sai (false). Xem...

Unit Test là gì? Tìm hiểu về khái niệm kiểm thử...

Unit Test sẽ giúp người dùng có thể xây dựng dự án một cách hiệu quả, để biết được những thông tin hữu ích về Unit Test. Hãy theo dõi thông tin...

CSRF là gì? Tìm hiểu cách chống tấn công giả...

CSRF (Cross-Site Request Forgery) là một dạng tấn công trong các ứng dụng web. Tìm hiểu chi tiết về CSRF và cách bảo vệ ứng dụng khỏi nguy cơ này.

Middleware là gì? Tầm quan trọng của middleware...

Middleware là một đoạn mã trung gian nằm trong các ứng dụng web được thiết kế trên mô hình client-server. Tìm hiểu middleware là gì và ứng dụng của...

JWT là gì? Tìm hiểu về khái niệm JSON Web Token

JWT (JSON Web Token) là một phương thức xác thực bằng mã hóa phổ biến trong các ứng dụng web, giúp truyền tải thông tin, xác thực và ủy quyền một...

Shell là gì? Các loại môi trường dòng lệnh phổ...

Shell còn được gọi là môi trường dòng lệnh. Đây là nơi cho phép người dùng tương tác với hệ điều hành thông qua các dòng lệnh. Tìm hiểu về shell và...