- vừa được xem lúc

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

0 1 42

Người đăng: Nguyen Van Tam

Theo Viblo Asia

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.

Title Author Author Nationality Format Price Subject Pages Thickness Publisher Publisher Country Publication Type Genre ID Genre Name
Beginning MySQL Database Design and Optimization Chad Russell American Hardcover 49.99 MySQL,Database,Design 520 Thick Apress USA E-book 1 Tutorial

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.

Title Format Author Author Nationality Price Subject 1 Subject 2 Subject 3 Pages Thickness Publisher Publisher country Genre ID Genre Name
Beginning MySQL Database Design and Optimization Hardcover Chad Russell American 49.99 MySQL Database Design 520 Thick Apress USA 1 Tutorial

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à: Book, Subject and Publisher

Title Format Author Author Nationality Price Pages Thickness Genre ID Genre Name Publisher ID
Beginning MySQL Database Design and Optimization Hardcover Chad Russell American 49.99 520 Thick 1 Tutorial 1

Bảng Publisher

Publisher_ID Name Country
1 Apress USA

Bảng Subject

Subject ID Subject name
1 MySQL
2 Database
3 Design

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

Title Subject ID
Beginning MySQL Database Design and Optimization 1
Beginning MySQL Database Design and Optimization 2
Beginning MySQL Database Design and Optimization 3

Đế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}

Title Format Author Author Nationality Price Pages Thickness Genre ID Genre Name Publisher ID
Beginning MySQL Database Design and Optimization Hardcover Chad Russell American 49.99 520 Thick 1 Tutorial 1
Beginning MySQL Database Design and Optimization E-book Chad Russell American 22.34 520 Thick 1 Tutorial 1
The Relational Model for Database Management: Version 2 E-book E.F.Codd British 13.88 538 Thick 2 Popular science 2
The Relational Model for Database Management: Version 2 Paperback E.F.Codd British 39.99 538 Thick 2 Popular science 2

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 TitleFormat.

Để 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

Title Author Author Nationality Pages Thickness Genre ID Genre Name Publisher ID
Beginning MySQL Database Design and Optimization Chad Russell American 520 Thick 1 Tutorial 1
The Relational Model for Database Management: Version 2 E.F.Codd British 538 Thick 2 Popular science 2

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

Bảng Format - Price

Title Format Price
Beginning MySQL Database Design and Optimization Hardcover 49.99
Beginning MySQL Database Design and Optimization E-book 22.34
The Relational Model for Database Management: Version 2 E-book 13.88
The Relational Model for Database Management: Version 2 Paperback 39.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

Title Author Pages Thickness Genre ID Publisher ID
Beginning MySQL Database Design and Optimization Chad Russell 520 Thick 1 1
The Relational Model for Database Management: Version 2 E.F.Codd 538 Thick 2 2

Bảng Authors

Author Author Nationality
Chad Russell American
E.F.Codd British

Bảng Genres

Genre ID Genre Name
1 Tutorial
2 Popular 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 ID Title Location
1 Beginning MySQL Database Design and Optimization California
1 Beginning MySQL Database Design and Optimization Florida
1 Beginning MySQL Database Design and Optimization Texas
1 The Relational Model for Database Management: Version 2 California
1 The Relational Model for Database Management: Version 2 Florida
1 The Relational Model for Database Management: Version 2 Texas
2 Beginning MySQL Database Design and Optimization California
2 Beginning MySQL Database Design and Optimization Florida
2 Beginning MySQL Database Design and Optimization Texas
2 The Relational Model for Database Management: Version 2 California
2 The Relational Model for Database Management: Version 2 Florida
2 The Relational Model for Database Management: Version 2 Texas
3 Beginning MySQL Database Design and Optimization Texas

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 ID Title
1 Beginning MySQL Database Design and Optimization
1 The Relational Model for Database Management: Version 2
2 Beginning MySQL Database Design and Optimization
2 The Relational Model for Database Management: Version 2
3 Beginning MySQL Database Design and Optimization

Bảng Franchisee - Location

Franchisee ID Location
1 California
1 Florida
1 Texas
2 California
2 Florida
2 Texas
3 Texas

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

Bình luận

Bài viết tương tự

- vừa được xem lúc

Mô hình quan hệ - thực thể (Entity – Relationship Model)

Mô hình quan hệ thực thể (Entity Relationship model - E-R) được CHEN giới thiệu vào năm 1976 là một mô hình được sử dụng rộng rãi trong các bản thiết kế cơ sở dữ liệu ở mức khái niệm, được xây dựng dựa trên việc nhận thức thế giới thực thông qua tập các đối tượng được gọi là các thực thể và các mối

0 0 132

- vừa được xem lúc

[Embulk #1] Công cụ giúp giảm nỗi đau chuyển đổi dữ liệu

Embulk là gì. Embulk là một công cụ open source có chức năng cơ bản là load các record từ database này và import sang database khác.

0 0 55

- vừa được xem lúc

Window Functions trong MySQL, Nâng cao và cực kì hữu dụng (Phần II).

Chào mọi người, lại là mình đây, ở phần trước mình đã giới thiệu với mọi người về Window Functions Phần I. Nếu chưa rõ nó là gì thì mọi người nên đọc lại trước nha, để nắm được định nghĩa và các key words, tránh mắt chữ O mồm chứ A vì phần này mình chủ yếu sẽ thực hành với các Window Functions.

0 0 107

- vừa được xem lúc

Window Functions trong MySQL, Nâng cao và cực kì hữu dụng (Phần I).

Chào mọi người, mình mới tìm hiểu đc topic Window Functions cá nhân mình cảm thấy khá là hay và mình đánh giá nó là phần nâng cao. Vì ít người biết nên Window Functions thấy rất ít khi sử dụng, thay vì đó là những câu subquery dài dằng dặc như tin nhắn nhắn cho crush, và người khác đọc hiểu được câu

0 0 923

- vừa được xem lúc

Disable và Enable trigger trong Oracle

Origin post: https://www.tranthanhdeveloper.com/2020/12/disable-va-enable-trigger-trong-oracle.html.

0 0 41

- vừa được xem lúc

Lưu trữ dữ liệu với Data Store

. Data Store là một trong những componet của bộ thư viện Android JetPack, nó là một sự lựa chọn hoàn hảo để thay thế cho SharedPreferences để lưu trữ dữ liệu đơn giản dưới dạng key-value. Chúng ta cùng làm một so sánh nhỏ để thấy sự tối ưu của Data Store với SharedPreferences nhé.

0 0 71