Trong các hệ quản trị CSDL như MySQL hay SQL SERVER đều có khái niệm table (bảng) và mỗi table sẽ có các thông tin (column) xác định, có nghĩa bạn không thể chỉnh sửa cấu trúc lưu trữ của một table được. Nhưng với MongoDB thì lại khác, các collection (table trong MySQL) lưu trữ trong MongoDB có sự linh động và cấu trúc có thể khác nhau, nghĩa là một collection bạn có thể lưu hai loại dữ liệu hoàn toàn khác nhau (theo node).
1. So sánh RDBMS và MongoDB
Để rõ ràng hơn thì chúng ta có một bài toán thế này: Hãy thiết kế mô hình CSDL cho trường hợp lưu trữ tin tức, mỗi tin tức có thể có nhiều comment và có nhiều tags.
Trường hợp RDBMS: Trong trường hợp này chúng ta sẽ tạo tối thiểu là 3 bảng gồm POST, COMMENTS, TAG_LIST như hình dưới đây (Ảnh sưu tầm).
Khi truy vấn chúng ta sẽ JOIN các bảng lại với nhau để lấy thông tin.
Trường hợp MongoDB: Với MongoDB thì ta không thể thiết kế theo mô hình kia được, trường hợp này chúng ta sẽ có một collection tên POST với cấu trúc lưu trữ như sau:
{ _id: POST_ID title: TITLE_OF_POST, description: POST_DESCRIPTION, by: POST_BY, url: URL_OF_POST, tags: [TAG1, TAG2, TAG3], likes: TOTAL_LIKES, comments: [ { user:'COMMENT_BY', message: TEXT, dateCreated: DATE_TIME, like: LIKES }, { user:'COMMENT_BY', message: TEXT, dateCreated: DATE_TIME, like: LIKES } ]}
Nhìn kỹ hơn bạn thấy nó giống JSON (tham khảo JSON là gì?)
Mỗi khi insert dữ liệu vào thì bạn sẽ phải truyền nó vào một chuỗi JSON y chang cấu trúc trên. Chính vì là JSON nên ban phải lưu ý các ký tự đặc biệt khi INSERT bằng code PHP nhé.
2. Một số lưu ý khi thiết kế lược đồ MongoDB
Khi thiết kế CSDL với MongoDB thì không giống như trong MySQL nên bạn cần phải cân nhắc các lưu ý sau:
- Cấu trúc theo yêu cầu của người dùng (khách hàng)
- Kết hợp chung vào chung một document nếu nó có dính líu với nhau. Nếu không tách chúng ra và truy vấn nhiều lần để lấy kết quả theo mong muốn
- Dupplicate data (nhân đôi dữ liệu) ở mức hạn chế vì năm 2015 vấn đề dung lượng lưu trữ không quan trọng nữa mà họ chỉ quan tâm tới tốc độ truy vấn
- Thực hiện JOIN trong khi insert, không thể JOIN khi select được.
- Tối ưu hóa CSDL cho các trường hợp thường xuyên sử dụng
3. Lời kết
Nếu ban làm việc quen với MySQL rồi thì bạn sẽ có nhiều bỡ ngỡ khi tìm hiểu MongoDB, nhưng nếu bạn đã tìm hiểu JSON rồi thì bạn sẽ dễ dàng học MongoDB hơn.
Trong bài viết mình có tham khảo một số website như:
- Tutorialpoints