So sánh bán hàng trên facebook và trên Shopee
Bán hàng trên facebook và bán hàng trên shopee là hai nền tảng kinh doanh online phổ biến hiện nay. Mỗi nền tảng có những thế mạnh riêng để thực...
Loại bỏ dư thừa dữ liệu
Loại bỏ update dị thường
Loại bỏ insertion dị thường
Loại bỏ deletion dị thường
Các dạng chuẩn hóa dữ liệu
Chuẩn hoá là quá trình tách bảng [phân rã] thành các bảng nhỏ hơn dựa vào các phụ thuộc hàm. Các dạng chuẩn là các chỉ dẫn để thiết kế các bảng trong CSDL.
Mục đích của chuẩn hoá là loại bỏ các dư thừa dữ liệu và các lỗi khi thao tác dư thừa và các lỗi khi thao tác dữ liệu [Insert, Delete, Update]. Nhưng chuẩn hoá làm tăng thời gian truy vấn.
1NF [First Normal Form]
Định nghĩa: Một bảng [quan hệ] được gọi là ở dạng chuẩn 1NF nếu và chỉ nếu toàn bộ các miền giá trị của các cột có mặt trong bảng [quan hệ] đều chỉ chứa các giá trị nguyên tử [nguyên tố]
Một bảng [quan hệ] chưa ở 1NF:
A01 | Lê Na | 12 Thái Hà | M01M02 | CSDLAnh | 89 |
A02 | Trần An | 56 Mã Mây | M01 | CSDL | 8 |
A03 | Hà Nam | 24 Cầu Gỗ | M01M02M03 | CSDLAnhToán 1 | 689 |
Dạng chuẩn 2 – 2NF
Định nghĩa Một quan hệ ở dạng chuẩn 2NF nếu quan hệ đó:
- Là 1NF
- Các thuộc tính không khoá phải phụ thuộc hàm đầy đủ vào khoá chính
Ví dụ
Ví dụ1: Cho quan hệ R = [ABCD] , khoá là AB và tập phụ thuộc hàm F = {AB -> C, AB -> D}là quan hệ đạt chuẩn 2NF.
Ví dụ2: Cho quan hệ R = [ABCD] , khoá là AB và tập phụ thuộc hàm
F = {AB -> C, AB -> D, B -> DC} là quan hệ không đạt chuẩn 2NF vì có phụ thuộc hàm
B -> DC là phụ thuộc hàm bộ phận [phụ thuộc hàm không đầy đủ] vào khoá. Khi đó ta đưa về dạng chuẩn 2NF như sau:
Nhận xét
Một quan hệ ở dạng chuẩn 2NF nếu thoả mãn 1 trong các đièu kiện sau: Khoá chính chỉ gồm một thuộc tính Bảng không có các thuộc tính không khoá Tất cả các thuộc tính không khoá phụ thuộc hoàn toàn vào tập các thuộc tính khoá chính
Dạng chuẩn 3 – 3NF
Định nghĩa Một quan hệ ở dạng chuẩn 3NF nếu quan hệ đó:
- Là 2NF
- Các thuộc tính không khoá phải phụ thuộc trực tiếp vào khoá chính
Ví dụ
Ví dụ1: Cho quan hệ R = [ABCDGH, khoá là AB và tập phụ thuộc hàm F = {AB -> C, AB -> D, AB -> GH} là quan hệ đạt chuẩn 3NF.
Ví dụ2: Cho quan hệ R = [ABCDGH] , khoá là AB và tập phụ thuộc hàm
F = {AB -> C, AB -> D, AB -> GH, G -> DH} là quan hệ không đạt chuẩn 3NF vì có phụ thuộc hàm G ® DH là phụ thuộc hàm gián tiếp vào khoá. Khi đó ta đưa về dạng chuẩn 3NF như sau:
Dạng chuẩn BCNF [Boyce Codd Normal Form]
Định nghĩa Một quan hệ ở dạng chuẩn BCNF nếu quan hệ đó:
- Là 3NF
- Không có thuộc tính khoá mà phụ thuộc hàm vào thuộc tính không khoá.
Ví dụ
Ví dụ1: Cho quan hệ R = [ABCDGH, khoá là AB và tập phụ thuộc hàm F = {AB -> C, AB -> D, AB -> GH} là quan hệ đạt chuẩn BCNF.
Ví dụ2: Cho quan hệ R = [ABCDGH] , khoá là AB và tập phụ thuộc hàm
F = {AB -> C, AB -> D, AB -> GH, H -> B} là quan hệ không đạt chuẩn BCNF vì có thuộc tính khoá B phụ thuộc hàm vào thuộc tính không khoá H. Khi đó ta đưa về dạng chuẩn BCNF như sau:
Chuẩn hóa cơ sở dữ liệu là áp dụng các qui tắc cho thiết kế của cơ sở dữ liệu nhằm giúp giảm dư thừa dữ liệu trong quá trình thiết kế Cơ sở dữ liệu. Đây là bước quan trọng để giúp bạn kiểm tra tính đúng đắn của quá trình thiết kế cơ sở dữ liệu.
Bài viết này sẽ giúp bạn hiểu về các mức chuẩn hóa, quá trình thực hiện chuẩn hóa cũng như áp dụng việc chuẩn hóa vào thiết kế cơ sở dữ liệu.
Các mức chuẩn hóa
Về lý thuyết thì có 7 mức chuẩn hóa khác nhau:
Tạm thời mình để đầy đủ các chuẩn và mô tả bằng tiếng Anh bạn nào quan tâm thì chịu khó đọc. Tuy nhiên, đối với thiết kế Cơ sở dữ liệu thì bạn chỉ cần áp dụng đến mức 3 là được. Do vậy, chúng ta sẽ chỉ tìm hiểu kỹ 03 mức chuẩn hóa đầu tiên.
Chuẩn 1 [1NF – First Normal Form]: Giá trị được lưu trữ trong các ô phải là các giá trị đơn [scalar value] và trong bảng không có cột nào lặp lại.
Chuẩn 2 [2NF – Second Normal Form]: Mọi trường không phải là khóa phải phụ thuộc vào khóa chính.
Chuẩn 3 [3NF – Third Normal Form]: Mọi trường không phải là khóa chỉ phụ thuộc vào khóa chính mà thôi.
Tiến trình chuẩn hóa
- 1. Tiến trình để đưa bảng dữ liệu về chuẩn 1:
- -> Chia các thành phần dữ liệu thành đơn vị nhỏ nhất hữu dụng
- -> Loại bỏ các trường lặp lại, các trường tính toán trong bảng chúng ta có chuẩn 1
- 2. Tiến trình để đưa bảng dữ liệu về chuẩn 2:
-> Từ chuẩn 1, tách các trường không phụ thuộc vào khóa chính ra bảng riêng ta sẽ được chuẩn 2.
- 3. Tiến trình để đưa bảng dữ liệu về chuẩn 3:
-> Từ chuẩn 2, tách các trường không phụ thuộc hoàn toàn vào khóa chính [có nghĩa là có phụ thuộc thêm ít nhất một trường khác nữa ngoài khóa chính] ra bảng khác chúng ta sẽ được chuẩn 3.
Thực hành việc chuẩn hóa
Để hiểu rõ về các chuẩn và chuẩn hóa chúng ta thực hành sử dụng chuẩn hóa để xây dựng Cơ sở dữ liệu cho hệ thống quản lý đơn hàng như ở bài trước.
Mẫu đơn hàng
Sau khi phân tích dữ liệu ta được các trường như sau:
Bảng Invoice [Hóa đơn]
InvoiceNo: Số hóa đơn
InvoiceDate: Ngày ghi hóa đơn
CustomerName: Tên khách hàng
CustomerCompany: Tên công ty khách hành
CustomerAddress: Địa chỉ khách hàng
CustomerAccountNo: Số tài khoản của khách hàng
PaymentMethod: Phương thức thanh toán
CustomerTaxNo: Mã số thuế của khách hàng
SequenceNo: Số thứ tự mua hành
ProductName: Tên sản phẩm
Unit: Đơn vị tính của sản phẩm
Quantity: Số lượng
UnitPrice: Đơn giá
Amount: Thành tiền
TotalAmount: Tổng tiền
VAT: Thuế giá trị gia tăng
TotalPay: Tổng tiền phải trả
ByText: Ghi bằng chữ
1. Đưa bảng dữ liệu về chuẩn 1:
- 1. Chia các thành phần dữ liệu thành đơn vị nhỏ nhất hữu dụng:
- -> Chia trường CustomerName thành CustomerFirstName và CustomerLastName
- -> Chia trường CustomerAddress thành CustomerAddress, CustomerDistrict và CustomerCity
- 2. Loại bỏ các trường lặp lại và tính toán
- -> Loại bỏ các trường: Amount, TotalAmount, TotalPay, ByText
[Xem lại bài Thiết kế cơ sở dữ liệu để hiểu vì sao tách các trường này và vì sao loại bỏ các trường trên]
Lúc này ta được bảng dữ liệu theo chuẩn 1 như sau:
Bảng Invoice [Hóa đơn]
InvoiceNo: Số hóa đơn
InvoiceDate: Ngày ghi hóa đơn
CustomerFirstName: Tên khách hàng
CustomerLastName: Họ lót khách hàng
CustomerCompany: Tên công ty khách hành
CustomerAddress: Địa chỉ khách hàng
CustomerDistrict: Quận nơi khách hàng đang ở
CustomerCity: Thành phố nơi khách hàng đang ở
CustomerAccountNo: Số tài khoản của khách hàng
PaymentMethod: Phương thức thanh toán
CustomerTaxNo: Mã số thuế của khách hàng
SequenceNo: Số thứ tự mua hành
ProductName: Tên sản phẩm
Unit: Đơn vị tính của sản phẩm
Quantity: Số lượng
UnitPrice: Đơn giá
VAT: Thuế giá trị gia tăng
2. Đưa bảng dữ liệu về chuẩn 2:
- Từ chuẩn 1, xem xét các trường không phụ thuộc vào khóa chính để tách ra thành bảng riêng.
- 1. Xem xét từ trên xuống chúng ta sẽ thấy các trường: CustomerFirstName, CustomerLastName, CustomerCompany, CustomerAddress, CustomerDistrict, CustomerCity, CustomerAccountNo, CustomerTaxNo phụ thuộc vào khách hàng chứ không phụ thuộc vào hóa đơn nên tách nhóm này ra thành bảng Khách hàng [Customer], phát sinh mã khách hàng làm khóa chính.
- 2. Các trường: ProductName, Unit phụ thuộc vào sản phẩm chứ không phải hóa đơn nên tách ra thành bảng Sản phẩm [Product] và phát sinh khóa chính cho nó.
Lúc này chúng ta có được 03 bảng dữ liệu như sau:
Customer
CustomerNo
CustomerFirstName
CustomerLastName
CustomerCompany
CustomerAddress
CustomerDistric
CustomerCity
CustomerAccountNo
CustomerTaxNo
Product
ProductNo
ProductName
Unit
Invoice
InvoiceNo
InvoiceDate
PaymentMethod
SequenceNo
Quantity
UnitPrice
VAT
Xác định mối quan hệ và đặt khóa ngoại cho trường CustomerNo và ProductNo chúng ta được sơ đồ thực thể cho mức 2 như sau:
3. Đưa các bảng dữ liệu về chuẩn 3:
- Xem xét các trường từ các bảng không phụ thuộc hoàn toàn vào khóa chính ra bảng khác để về chuẩn 3.
- 1. Các trường ở bảng Customer và Product đã phụ thuộc hoàn toàn vào khóa chính nên các bảng này đã ở chuẩn 3
- 2. Các trường SequenceNo, Quantity, UnitPrice của bảng Invoice bên cạnh việc phụ thuộc vào hóa đơn nó còn phải phụ thuộc vào ProductNo [mặt hàng nào] nữa mới biết được giá trị của nó. Nên các trường này không phụ thuộc hoàn toàn vào khóa chính. Tách các trường này ra bảng mới và đặt tên thành OrderDetails và phát sinh khóa chính cho nó.
Lúc này bảng Invoice được chia thành Invoice và InvoiceDetails như sau:
Invoice
InvoiceNo
InvoiceDate
PaymentMethod
VAT
CustomerNo
InvoiceDetails
InvoiceDetailsNo
SequenceNo
ProductID
Quantity
UnitPrice
Lúc này tất cả các bảng đã ở chuẩn mức 3. Thiết lập mối quan hệ và khóa ngoại ta được sơ đồ quan hệ thực thể như sau:
Lưu ý
Trong bài này để bạn nắm rõ về các mức chuẩn hóa tôi đã áp dụng chuẩn hóa từ Mức 1 -> Mức 2 -> Mức 3. Trong thực tế, khi thiết kế cơ sở dữ liệu bạn làm qua 4 bước đầu tiên trong quá trình thiết kế cơ sở dữ liệu như ở bài Thiết kế cơ sở dữ liệu để có sơ đồ quan hệ thực thể. Sau đó, áp dụng các qui tắc chuẩn hóa này để kiểm tra các bảng và đưa các bảng về chuẩn 3 thì sẽ dễ hiểu và dễ thực hiện hơn.
Kết luận
Chuẩn hóa Cơ sở dữ liệu để đạt chuẩn 3 là công việc bắt buộc trong thiết kế cơ sở dữ liệu quan hệ. Tuy nhiên, rất nhiều bạn mặt dù đã học qua môn học này vẫn chưa nắm rõ các qui tắc này. Bài viết này hy vọng giúp đỡ được bạn.
Bài tiếp: Vấn đề dư thừa dữ liệu trong thiết kế cơ sở dữ liệu
Bài trước: Thiết kế cơ sở dữ liệu – Các bước thực hiện
Nếu bạn có chỗ nào chưa rõ hoặc có quan điểm khác vui lòng thảo luận bên dưới.