Cơ sở dữ liệu MONGODB

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