Đã lâu chưa viết bài về vấn đề kỹ thuật, nay viết bài này để chia sẽ tới các bạn một kỹ thuật trong nhóm các kỹ thuật tối ưu trong xây dựng ứng dụng web lớn (Large-scale Web Application), đó là kỹ thuật “Denormalization“. Ứng dụng lớn là các ứng dụng đòi hỏi khả năng chịu tải lớn và cần tối ưu về performance và tốc độ truy xuất database vì xu thế web bây giờ thao tác truy xuất database diễn ra rất thường xuyên.

Denormalization là kỹ thuật trong nhóm kỹ thuật tối ưu thiết kế cơ sở dữ liệu quan hệ (RDBMS). Như các bạn có được học thì hệ cơ sở dữ liệu quan hệ được thiết kế sử dụng mô hình BẢNG và sử dụng cột(Key) làm mối quan hệ. Và các bạn nếu có tìm hiểu thì cũng biết quá trình thiết kế cơ sở dữ liệu trải qua 3 bước Normalization (Chuẩn hóa) để dữ liệu được thiết kế sao cho tối ưu, không trùng lặp, dễ mở rộng và thay đổi.

Tuy nhiên, việc chuẩn hóa không phải lúc nào cũng phát huy hết tác dụng trong các ứng dụng thực tế. Ví dụ dưới đây là một mô hình database đã được chuẩn hóa cho chức năng tạo comment.

Như các bạn có làm qua cơ sở dữ liệu thì việc hiển thị thông tin comment với tên người gởi(sender) chỉ cần một câu lệnh JOIN để lấy thông tin của sender từ table User, ví dụ: “SELECT * FROM Comment INNER JOIN User ON c_senderid = u_id WHERE …”.

Đối với các ứng dụng nhỏ thì thao tác này chạy rất OK và database thiết kế như thế là đã chuẩn hóa rồi. Nhưng đối với các ứng dụng lớn, quá trình JOIN trong câu lệnh SELECT không phải là một thao tác nhanh và sẽ tốn thời gian xử lý phức tạp hơn vì cần phải JOIN 2 table. Trong trường hợp Table User quá lớn và table Comment cũng lớn thì việc JOIN trong câu lệnh SELECT sẽ là nổi ám ảnh cho ứng dụng của bạn.

Do gặp những tình huống như vậy, việc chuẩn hóa sẽ không tốt cho các câu lệnh SELECT cho ứng dụng dạng này nên kỹ thuật chuẩn hóa ngược (De-normalization) đã ra đời nhằm tăng tốc các câu lệnh SELECT và giảm việc JOIN khi không cần thiết. Dưới đây là mô hình database đã sử dụng kỹ thuật Denormalization, thêm một Field là c_senderusername để lưu thông tin người gởi mà không cần phải JOIN trong câu SELECT mới ra được username.

Vì đây gọi là quá trình chuẩn hóa ngược nên không nên sử dụng tùy tiện vì nó đi ngược lại quá trình chuẩn hóa, sẽ xảy ra quá trình douple dữ liệu cho một số field mà bạn sử dụng. Tuy nhiên, nếu sử dụng đúng chỗ thì kỹ thuật denormalization sẽ cải thiện nhiều cho các thao tác SELECT của bạn. Và nên nhớ, JOIN là nổi ám ảnh cho table lớn và LEFT JOIN (hay RIGHT JOIN) là nổi ám ảnh của nổi ám ảnh ^^.

Hy vọng bài viết giúp đỡ được phần nào cho việc thiết kế cơ sở dữ liệu cho ứng dụng “lớn” của bạn.

Bài viết liên quan:

8 Lời bình cho bài viết “Database Denormalization”

Viết lời bình



Bình luận mới nhất