Từng bước để chuẩn hóa dữ liệu Database

Tram Ho

Chả là dự án đang phát triển một feature lớn, phải thiết kế thêm nhiều bảng, anh em dự án cứ bảo “Khách Hàng chẳng tuân thủ chuẩn hóa DB gì cả”, mình mặc dù cũng có nhớ thời ĐH học rồi, cơ mà để chắc chắn điều anh em nói, tìm hiểu loanh quanh trên mạng; Và giờ chia sẻ lại cho anh em nhé”. 

Khái niệm Chuẩn hóa là một kĩ thuật trong thiết kế DB, được sử dụng để thiết kế table của CSDL quan hệ lên “những” tiêu chuẩn cao hơn.

Kĩ thuật này được chia ra nhiều cấp độ gồm: để tiến lên cấp độ sau yêu cầu cấp độ trước đó phải được thỏa mãn. Ví dụ, ta đang có bộ data dạng chưa chuẩn hóa (đây là cấp thấp nhất) và ta đang mong muốn đạt được cấp độ chuẩn hóa cao nhất.

Thì bước đầu tiên trước hết phải đảm bảo dạng chuẩn hóa I được tuân thủ, sau đó chúng ta thiết kế tiếp tục DB để thỏa mãn các yêu cầu riêng của dạng chuẩn hóaII,… và cứ như thế cho đến khi bộ data của chúng ta đạt đến dạng chuẩn hóa thứ VI.


NOTE

Dạng chuẩn hóa thứ IV trở lên chỉ mang tính chất lý thuyết, các vấn đề mà các dạng này hướng đến giải quyết thường hiếm xuất hiện trong thực tế.


Data khởi tạo

Dưới đây là ví dụ về bộ data khởi tạo – chưa được chuẩn hóa.

TitleAuthorAuthor NationalityFormatPriceSubjectPagesThicknessPublisherPublisher CountryPublication TypeGenre IDGenre Name
Beginning MySQL Database Design and OptimizationChad RussellAmericanHardcover49.99MySQL,Database,Design520ThickApressUSAE-book1Tutorial

Ta đặt giả định là 1 sách thì chỉ thuộc về 1 tác giá

1NF – Dạng chuẩn hóa I

Để thỏa mãn 1NF, giá trị trong mỗi cột cần phải là 1 giá trị đơn lẻ.

Nhìn vào bảng trên, cột Subject đang chứa nhiều hơn một giá trị, khiến bảng này chưa thỏa mãn 1NF.

Một cách để đạt 1NF trong trường hợp này là tách các giá trị đó ra nhiều cột Subject khác.

TitleFormatAuthorAuthor NationalityPriceSubject 1Subject 2Subject 3PagesThicknessPublisherPublisher countryGenre IDGenre Name
Beginning MySQL Database Design and OptimizationHardcoverChad RussellAmerican49.99MySQLDatabaseDesign520ThickApressUSA1Tutorial

Kết quả trên đã đáp ứng được chuẩn 1NF song có một vấn đề. Nếu một cuốn sách thuộc nhiều hơn 3 chủ đề, ta sẽ không thể thêm chủ để mới đó vào bảng mà không thêm một cột nữa vào bảng này.

Để giải quyết vấn đề này một cách tinh tế hơn, việc cần làm trước tiên là xác định các đối tượng xuất hiện trong bảng và chia chúng ra thành các bảng tương ứng. Với đề bài lần này, 3 bảng sẽ là: BookSubject and Publisher

TitleFormatAuthorAuthor NationalityPricePagesThicknessGenre IDGenre NamePublisher ID
Beginning MySQL Database Design and OptimizationHardcoverChad RussellAmerican49.99520Thick1Tutorial1

Bảng Publisher

Publisher_IDNameCountry
1ApressUSA

Bảng Subject

Subject IDSubject name
1MySQL
2Database
3Design

Rõ ràng, khi tách bảng thế này sẽ khiến data không còn liên kết với nhau nữa. Có nghĩa ta sẽ phải bằng cách nào đó biểu diễn mối quan hệ giữa các bảng này.

Các bạn để ý cột Publisher ID ở Bảng Books là khóa ngoại xác định mối quan hệ một – nhiều giữa book và publisher.

Mặt khác, 1 book có thể thuộc nhiều subject khác nhau, cũng như một subject có thể thuộc về nhiều quyền sách. Do vậy, ta cần một mối quan hệ nhiều-nhiều được biểu diễn ở bảng trung gian dưới đây:

Bảng Title – Subject

TitleSubject ID
Beginning MySQL Database Design and Optimization1
Beginning MySQL Database Design and Optimization2
Beginning MySQL Database Design and Optimization3

Đến thời điểm này, ta đã có tổng cộng là 4 bảng được tách ra từ bảng khởi tạo đầu tiên – chỉ để tuân theo chuẩn 1NF

Satisfying 2NF

Để xác định 1 book, với bảng dưới ta cần dùng the Khóa hợp của {Title, Format}

TitleFormatAuthorAuthor NationalityPricePagesThicknessGenre IDGenre NamePublisher ID
Beginning MySQL Database Design and OptimizationHardcoverChad RussellAmerican49.99520Thick1Tutorial1
Beginning MySQL Database Design and OptimizationE-bookChad RussellAmerican22.34520Thick1Tutorial1
The Relational Model for Database Management: Version 2E-bookE.F.CoddBritish13.88538Thick2Popular science2
The Relational Model for Database Management: Version 2PaperbackE.F.CoddBritish39.99538Thick2Popular science2

Ta thấy các cột mà không phải thuộc khóa hợp {Title, Format} đều chỉ phụ thuộc vào Title, mỗi cột Price thì phụ thuộc vào cả 2 Title và Format.

Để thỏa mãn chuẩn 2NF, ta cần đảm bảo rằng không có thuộc tính (cột) nào chỉ phụ thuộc 1 phần vào khóa hợp. Hay nói cách khác, trong chuẩn 2NF, mọi thuộc tính phải phụ thuộc hoàn toàn vào khóa hợp.

Với bài toán hiện tại, ta sẽ tách ra một bảng để cột Title trở thành khóa chính, tất cả các thuộc tính (cột) còn lại phụ thuộc hoàn toàn vào nó; còn cột Price thì tách ra bảng khác nơi mà nó phụ thuộc vào cột Format (và tất nhiên là cả Title)

Bảng Books

TitleAuthorAuthor NationalityPagesThicknessGenre IDGenre NamePublisher ID
Beginning MySQL Database Design and OptimizationChad RussellAmerican520Thick1Tutorial1
The Relational Model for Database Management: Version 2E.F.CoddBritish538Thick2Popular science2

Bảng Books giờ đây đã đạt chuẩn 2NF

Bảng Format – Price

TitleFormatPrice
Beginning MySQL Database Design and OptimizationHardcover49.99
Beginning MySQL Database Design and OptimizationE-book22.34
The Relational Model for Database Management: Version 2E-book13.88
The Relational Model for Database Management: Version 2Paperback39.99

Bảng Formats – Price vẫn chưa đạt chuẩn 2NF đâu nhé..

Satisfying 3NF

Bảng Books lúc này vẫn đang xảy ra một hiện tượng gọi là: phụ thuộc bắc cầu, cụ thể: {Author Nationality} thì phục thuộc vào {Author}, và {Author} thì phục thuộc vào {Title}.

Nhược điểm của nó là: nếu giá trị {Author} bị thay đổi, thì ta sẽ phải tìm và thay đổi toàn bộ các {Author Nationality} tương ứng ở các dòng khác (nếu có) trong bảng.

Tương tự chuyện xảy ra giữa {Genre Name} {Genre ID} và {Title}

Ta nói rằng bảng Books giờ đây chưa đạt chuẩn 3NF.

Để tuân thủ chuẩn này, ta sẽ thiết kế lại như sau: Tách Books ra thành 3 bảng với 2 bảng mới tương ứng là Authors và Genres.

Bảng Books

TitleAuthorPagesThicknessGenre IDPublisher ID
Beginning MySQL Database Design and OptimizationChad Russell520Thick11
The Relational Model for Database Management: Version 2E.F.Codd538Thick22

Bảng Authors

AuthorAuthor Nationality
Chad RussellAmerican
E.F.CoddBritish

Bảng Genres

Genre IDGenre Name
1Tutorial
2Popular science

4NF

Trước tiên muốn đạt chuẩn này cần đạt chuẩn BCNF, tức là mọi thuộc tính (cột) đều phải là thành phần của khóa hợp; hay chỉ cần có một cột không thuộc thành phần của khóa hợp là sai chuẩn BCNF.

Tiếp theo, chuần 4NF yêu cầu bên trong một table quan hệ KHÔNG được phép có nhiều hơn 1 quan hệ nhiều giá trị..

Cùng xem ví dụ sau:

Giả định các Books này được sở hữu bởi các Franchisee (Doanh nghiệp) có trụ sở tại nhiều Bang tại Mỹ. Lúc này ta cần thêm một bảng mới mô tả 1 books đang có mặt tại địa điểm nào. Giả định: mọi Franchisee đều có sách tại mọi trụ sở của nó

Bảng Franchisee – Book – Location

Franchisee IDTitleLocation
1Beginning MySQL Database Design and OptimizationCalifornia
1Beginning MySQL Database Design and OptimizationFlorida
1Beginning MySQL Database Design and OptimizationTexas
1The Relational Model for Database Management: Version 2California
1The Relational Model for Database Management: Version 2Florida
1The Relational Model for Database Management: Version 2Texas
2Beginning MySQL Database Design and OptimizationCalifornia
2Beginning MySQL Database Design and OptimizationFlorida
2Beginning MySQL Database Design and OptimizationTexas
2The Relational Model for Database Management: Version 2California
2The Relational Model for Database Management: Version 2Florida
2The Relational Model for Database Management: Version 2Texas
3Beginning MySQL Database Design and OptimizationTexas

Ta thấy có 2 quan hệ ở đây:

  1. Franchisee ->> Location (1 Franchisee có nhiều trụ sở)
  2. Franchisee ->> Book (1 Franchisee bán nhiều cuốn sách)

Lúc này, ta có thể nói bảng này có 2 quan hệ nhiều giá trị.

Để tuân thủ 4NF ta phải thiết kế lại sao cho chỉ có một quan hệ giá nhiều giá trị trong một bảng. Ta tách như sau:

Bảng Franchisee – Book

Franchisee IDTitle
1Beginning MySQL Database Design and Optimization
1The Relational Model for Database Management: Version 2
2Beginning MySQL Database Design and Optimization
2The Relational Model for Database Management: Version 2
3Beginning MySQL Database Design and Optimization

Bảng Franchisee – Location

Franchisee IDLocation
1California
1Florida
1Texas
2California
2Florida
2Texas
3Texas

Tổng kết

Các chuẩn còn lại rất nhiều song anh em lập trình mình biết tới đây chắc OK rồi nhỉ. Anh em nào muốn đọc kĩ hơn tài liệu gốc hãy xem các nguồn dưới đây thêm nhé:

Nguồn tham khảo

https://en.wikipedia.org/wiki/Database_normalization; https://www.geeksforgeeks.org/introduction-of-4th-and-5th-normal-form-in-dbms/; https://www.guru99.com/database-normalization.html

Chia sẻ bài viết ngay