Đỉnh NGUYỄN

life's a journey not a destination

Giới thiệu về MongoDB

Leave a comment


image

 

Giới thiệu NoSQL

Thường khi nói về database mọi người sẽ liên tưởng tới RDBMS – cơ sở dữ liệu quan hệ như MS SQL hay MySQL. Bởi vì một số lý do (như khó đảm bảo tính ACID khi dữ liệu nằm rải rác trên nhiều máy vật lý), các hệ cơ sở dữ liệu quan hệ thường khó chạy phân tán vì database phải chắn rằng các dữ liệu liên quan không bị sửa đổi hay xóa ngoài tầm kiểm soát trong một transaction. Điều này cũng dẫn tới các RDBMS khó scale up (khó chứ không phải không thể), cho nên thường người ta sẽ bổ sung thêm phần cứng thay vì cho nó chạy song song trên nhiều máy chủ.

Khái niệm NoSQL được tạo ra vào năm 1998 bởi Carlo Strozzi. Nhiều người nghĩ rằng khái niệm này dùng để hạ thấp SQL nhưng thực ra nó có nghĩa là Not Only SQL. Về mặt ý tưởng thì cả hai (NoSQL và RDMS) sẽ sống chung và bổ sung cho nhau.

NoSQL là 1 dạng CSDL mã nguồn mở không sử dụng T-SQL để truy vấn thông tin. NoSQL viết tắt bởi: None-Relational SQL, hay có nơi thường gọi là Not-Only SQL.

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,…

Chắc hẳn, bạn đã sử dụng 1 dạng CSDL quan hệ nào đó trước khi đọc bài viết này của tôi, có thể là: SQL Server, MySQL. Và tất nhiên không ít lần bạn vất vả trong việc chỉnh sửa các bảng dữ liệu khi liên quan tới khóa chính và khóa ngoại, hay 1 loạt các rắc rối khác trong quá trình làm việc. Bởi đó là CSDL quan hệ.

Với NoSQL bạn có thể mở rộng dữ liệu mà không lo tới những việc như tạo khóa ngoại, khóa chính, kiểm tra ràng buộc, .v.v…Vì NoSQL không hạn chế việc mở rộng dữ liệu nên tồn tại nhiều nhược điểm như: sự phục thuộc của từng bản ghi, tính nhất quán, toàn vẹn dữ liệu,….nhưng chúng ta có thể chấp nhận những nhược điểm đó để khiến ứng dụng cải thiện hiệu suất cao hơn khi giải quyết những bài toán lớn về hệ thống thông tin, phân tán hay lưu trữ dữ liệu.

Với các CSDL quan hệ, chi phí triển khai cũng như phát triển các ứng dụng sử dụng CSDL quan hệ cũng rất tốn kém và điều quan trọng được bộc lộ rõ khi truy vấn 1 lượng bản ghi lớn trong thời gian rất dài. Tiếp đó những thiết bị cầm tay như smartphone thì không phù hợp để triển khai CSDL quan hệ vì dung lượng bộ nhớ thấp và khả năng xử lý kém hơn máy tính. Và còn rất nhiều lí do khác nữa để chúng ta quyết định việc áp dụng NoSQL vào trong dự án của mình. Bạn có thể tham khảo thêm những thông tin khác về NoSQL trên mạng.

NoSQL được sử dụng ở đâu? NoSQL được sử dụng ở rất nhiều công ty, tập đoàn lớn, ví dụ như FaceBook sử dụng Cassandra do FaceBook phát triển, Google phát triển và sử dụng BigTable,…., và công ty mình đang làm việc sử dụng MongoDB.

Tham khảo: http://en.wikipedia.org/wiki/NoSQL

Các loại CSDL NoSQL

NoSQL database được phân ra thành nhiều loại, bao gồm:

  • Key/values
  •               o Dynamo

             o Apache Cassandra

             o Voldemort

             o Memcached

  • Tabular
  •               o BigTable

  • Document database
  •               o MongoDB

             o Apache CouchDB

  • Graph database
  •               o Neo4j

Khi nào nên dùng và không dùng?

Nó được dùng khi nào?

  • Lượng dữ liệu lớn (large data set)
  • Chịu tải cao

Nó không được dùng khi nào?

  • Các ứng dụng cần sử dụng nhiều transaction (như ngân hàng)
  • Các ứng dụng cần SQL (sử dụng joins)

Giới thiệu về MongoDB

MongoDB là 1 hệ thống CSDL mã nguồn mở được phát triển và hỗ trợ bởi 10gen, là CSDL NoSQL hàng đầu được hàng triệu người sử dụng.

clip_image002 clip_image001

  Thay vì lưu trữ dữ liệu dưới dạng bảng và các tuple như trong các CSDL quan hệ thì nó lưu trữ dữ liệu dưới dạng JSON (trong MongoDB được gọi là dạng BSON vì nó lưu trữ dưới dạng binary từ 1 JSON document).

clip_image004

Trang chủ: http://www.mongodb.org/

10gen: http://www.10gen.com/

Cách thức lưu trữ dữ liệu MongoDB

MongoDB được rút ra từ “humongous”, có nghĩa là rất lớn. Nó được phát triển từ C++ bởi công ty 10gen.

Về cơ bản, mọi thứ trong MongoDb được lưu trữ với dạng document, cụ thể là json-style document (BSON). Và như vậy là nó sẽ không có schema, không có lưu trữ dữ liệu dạng bảng như cơ sở dữ liệu quan hệ, và cũng không có joins.

Dữ liệu được lưu trữ sẽ trông giống như thế này:

{

     _id: 0,

     title: ”,

     body: ”,

     comments: [{

          person: ”,

          comment: ”,

          created_at: new Date()

     }],

     created_at: new Date()

}

Câu hỏi khiến nhiều người thắc mắc là làm thế nào để truy vấn NoSQL nếu như nó không hỗ trợ ngôn ngữ SQL. Mặc dù không phải là RDBMS nhưng MongoDB vẫn cung cấp các cơ chế để truy vấn dữ liệu. Cụ thể như sau:

db.collection.find( <query>, )

Phương thức find() tương đương với câu SELECT trong SQL, và tương đương với mệnh đề WHERE, còn tương ứng với danh sách các fields ta cần truy vấn.

Ví dụ ta có một collection chứa các bộ phim, mỗi phần tử gồm có title và rating của khán giả.

> db.movies.insert({title:"SHERLOCK BBC", rating:9.2})

> db.movies.insert({title:"Elementary TV Series", rating:7.6})

> db.movies.insert({title:"Lie to Me (2009-2011)", rating:7.8})

/*SELECT * FROM movies WHERE title= ‘Elementary TV Series’*/

> db.movies.find({title:"Elementary TV Series"})

{

"_id" : ObjectId("51556737c79ef506ca8fc47d"),

"title" : "Elementary TV Series",

"rating" : 7.6

}

/*SELECT * FROM movies WHERE rating>9*/

> db.movies.find({rating:{$gt:9}})

{

"_id" : ObjectId("515567f1c79ef506ca8fc47f"),

"title" : "SHERLOCK BBC",

"rating" : 9.2 }

}

Ghi chú:

_id là một filed được mongoDB tự động sinh ra với kiểu dữ liệu là ObjectId

ObjectId là một giá trị BSON 12-byte được cấu thành từ:

4-byte timestamp,

3-byte machine identifier,

2-byte process id

3-byte counter, starting with a random value.

Capped collection

Đây là một fixed collection, tức là một tập hợp có số phần tử cố định khi khai báo. Ngoài ra nó đảm bảo lưu đúng thứ tự được chèn vào (natural order), mà không tự sắp xếp lại theo index hay bất kỳ yếu tố nào khác, đảm bảo thứ tự chèn vào và thứ tự lưu trên disk là giống nhau. Và khi số lượng phần tử trong collection đã chạm ngưỡng max thì khi chèn thêm một phần tử mới vào thì phần tử cũ nhất sẽ bị tống ra. Capped collection thích hợp để làm logging vì tốc độ nhanh do natural ordering (dữ liệu được lưu theo thứ tự nào thì lấy ra theo thứ tự đó không cần sort).

db.createCollection("someCollection",{

     capped: true,

     size:100000,

     max:100

})

Ghi chú:

size là maximum size của capped collection tính bằng byte

max là số phần tử tối đa trong capped collection đó

GridFS

GridFS giúp lưu trữ những file có kích thước vượt quá giới hạn của BSON-document 16MB trên một document (định dạng lưu trữ trong mongodb BJON = “binary” + “JSON”). Nó chia một file ra nhiều phần nhỏ (parts hoặc chunks).

Mỗi chunks được lưu trữ với dạng:

{

"_id" : ,

"files_id" : ,

"n" : ,

"data" :

}

// returns default GridFS bucket (e.g. "fs" collection)

GridFS myFS = new GridFS(myDatabase);

// saves the file to "fs" GridFS bucket

myFS.storeFile(new File("/tmp/largething.mpg"));

Geopartial Index

Nếu bạn muốn tìm một địa điểm có tọa độ X,Y trên bản đồ có bao nhiêu nhà hàng nằm gần đó (giả sử bạn có danh sách các địa điểm lưu trong database) thì bạn sẽ cần tới Geopartial Index. Nếu bạn cần tính khoảng cách giữa 2 điểm trên bản đồ thì bạn cũng sẽ cần dùng nó. Giá trị của index được gọi là geohash được tính bằng cách liên tục chia 4 bản đồ không ngừng, mỗi một phần tư như vậy sẽ mang một giá trị 2-bit.

MongoDB hỗ trợ các operation như:

Tìm chính xác

> db.places.find( { loc:[50,50]})

Tìm địa điểm gần

> db.places.find( { loc:{$near:[50,50]}})

Tìm địa điểm trong phạm vi cho trước

> db.places.find( { loc:{$near:[50,50], $maxDistance:5}})

Một lưu ý nhỏ là bởi vì trái đất của chúng ta không phải là một cái dĩa dẹt nên ta phải dùng công thức lượng giác để tính. Tuy nhiên MongoDB cũng có hỗ trợ vấn đề này sẵn, nên chúng ta chỉ việc dùng như sau:

db.runCommand({

     geoNear : "points" ,

     near : [0,0],

     spherical : true

})

Ánh xạ giữa MySQL và MongoDB

clip_image006

Các công cụ quản trị MongoDB

http://docs.mongodb.org/ecosystem/tools/administration-interfaces/

http://robomongo.org/

Advertisements

Author: dinhnn

Senior software developer, a technical leader. You can be reached at via email to dinhnguyenngoc@gmail.com, via my blog at dinhnguyenngoc.wordpress.com, and on Twitter @dinhnguyenngoc.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s