Cơ sở dữ liệu MONGODB
Bài đăng này đã không được cập nhật trong 9 năm
I. GIỚI THIỆU VỀ NOSQL
NoSQL còn có nghĩa là Non-Relational - không ràng buộc. Tuy nhiên, thuật ngữ đó ít phổ dụng hơn và ngày nay người ta thường dịch NoSQL thành Not Only SQL. NoSQL là một khái niệm chỉ về một lớp các hệ cơ sở dữ liệu không sử dụng mô hình quan hệ (RDBMS). RDBMS vốn tồn tại khá nhiều nhược điểm như có hiệu năng không tốt nếu kết nối dữ liệu nhiều bảng lại hay khi dữ liệu trong một bảng là rất lớn. NoSQL được phát triển trên Javascript Framework với kiểu dữ liệu là JSON và dạng dữ liệu theo kiểu key và value (1 đặc trưng về dữ liệu trong JSON). NoSQL ra đời như là 1 mảnh vá cho những khuyết điểm và thiếu xót cũng như hạn chế của mô hình dữ liệu quan hệ RDBMS về tốc độ, tính năng, khả năng mở rộng, memory cache,…
Đặc điểm của hệ CSDL mới này bao gồm: schema-free, hỗ trợ mở rộng dễ dàng, API đơn giản, nhất quán cuối (eventual consistency), không giới hạn không gian dữ liệu,...
II. HỆ CƠ SỞ DỮ LIỆU MONGODB
Trong bài viết này chúng ta sẽ tìm hiểu về MONGODB. Mongo viết bằng C++. Nó thích hợp cho các ứng dụng tầm trung trở lên. Nếu tỉ lệ lượng dữ liệu ghi vào CSDL của ứng dụng lớn hơn lượng đọc thì đây càng là lựa chọn hợp lý.
MongoDB là một CSDL có khả năng mở rộng, hiệu suất cao, mã nguồn mở và hướng văn bản.
Dưới đây là một vài khái niệm cơ bản của MongoDB:
- Văn bản Document là đơn vị cơ bản của dữ liệu trong MongoDB, nó tương đương với một dòng trong CSDL quan hệ
- Bộ sưu tập (Collection) có thể được coi như tương đương với một bảng.
- MongoDB có thể lưu trữ nhiều CSDL độc lập, mỗi CSDL này có các bộ sưu tập và điều khoản riêng của mình
- MongoDB đi kèm với một trình tiện ích JavaScript đơn giản nhưng mạnh mẽ, nó hữu ích trong quản trị và thao tác dữ liệu.
- Mỗi văn bản có một khóa đặc biệt, đó là “_id”, nó là duy nhất trong bộ sưu tập của văn bản.
3.1 Thiết kế lược đồ
Trong MongoDB không có khái niệm liên kết (join). Với mỗi đối tượng object, sẽ có một bộ sưu tập collection dữ liệu.
Một bộ sưu tập không phải cho tất cả các lớp (class), thay vào đó, các đối tượng sẽ được nhúng vào đó.
3.2 Chỉ mục
Chỉ mục là một cấu trúc dữ liệu, thu thập thông tin về giá trị của các trường trong các văn bản của một bộ sưu tập. Chỉ mục làm tăng hiệu suất của query lên rất nhiều. Nhưng cần phải xem xét tất cả các loại query cần trong ứng dụng để xác định những chỉ mục liên quan. Khi đã xác định xong, việc tạo ra các chỉ mục trong MongoDB là khá dễ dàng. Cấu trúc dữ liệu này được sử dụng trong tối ưu query Mongo để sắp xếp nhanh các văn bản trong colllection.
Khởi tạo chỉ mục bằng hàmensureIndex()
và cung cấp một văn bản với một hoặc nhiều khóa để đánh chỉ muc. Ví dụ đánh chỉ mục cho trường name trong students
db.students.ensureIndex({name:1});
HàmensureIndex()
chỉ khởi tạo chỉ mục nếu nó chưa tồn tại. Để kiểm tra việc tồn tại chỉ mục trên bộ sưu tập students, ta có thể chạy hàmdb.students.getIndexes()
.
Khi một collection được đánh chỉ mục trên một khóa nào đó, truy cập ngẫu nhiên trên biểu thức truy vấn có chứa khóa đó sẽ được thực hiện rất nhanh. Nếu không được đánh chỉ mục, MongoDB phải soát tất cả các văn bản để kiểm tra giá trị của khóa đó trong truy vấn.
Chỉ mục mặc định
Một chỉ mục luôn luôn được tạo ra la _id
. Chỉ mục này là đặc biệt và không thể bị xóa. Chỉ mục_id
là duy nhất cho các khóa của nó.
Các khóa nhúng
Với MongoDB chúng ta có thể đánh chỉ mục trên các khóa bên trong văn bản nhúng. Ví dụ
db.students.ensureIndex({"address.city": 1})
Văn bản như là khóa
Các trường được đánh chỉ mục có thể là bất kỳ loại nào, bao gồm cả văn bản.
Mảng
Khi giá trị của trường được đánh chỉ mục của văn bản là một mảng. MongoDB đánh chỉ mục mỗi phần tử của mảng đó.
3.3 Sao chép
MongoDB hỗ trợ sao chép dữ liệu không đồng bộ giữa các máy chủ. Tại một thời điểm, chỉ có 1 máy chủ hoạt động để ghi (primary hay master).
Có hai hình thức sao chép.
-
Master-Slave Replication
-
Replica Sets.
3.4 Truy vấn
Một trong những tính năng tốt nhất của MongoDB là hỗ trợ truy vấn đông.
Đối tượng biểu thức truy vấn
MongoDB hỗ trợ một số các đối tượng truy vấn để lấy dữ liệu. Ví dụ, để trả về mọi văn bản trong bộ sưu tập _users._
Truy vấn sẽ được viết như sau:
db.users.find({})
Chúng ta xem thêm một so ví dụ về các tùy chọn khi truy vấn.
Các tùy chọn truy vấn
Lựa chọn các trường
// lấy trường ssn của các văn bản có last_name == 'Smith'
: db.users.find({last_name: 'Smith'}, {'ssn': 1});
Sắp xễp
db.users.find({}).sort({last_name: 1});
Bỏ qua và giới hạn
db.users.find().skip(20).limit(10);
slaveOk
db.getMongo().setSlaveOk();
// cho phép truy vân slave
Con trỏ
Các query CSDL đưọc thực hiện bằng find(), lúc này có một con trỏ được trả về. Con trỏ sau đó được sử dụng lặp đi lặp lại để lấy tất cả các văn bản mà truy vấn trả về.
All rights reserved