Hệ quản trị dữ liệu MongoDB

Một phần của tài liệu Đánh giá và thu thập thông tin tự động trên internet sử dụng dịch vụ tìm kiếm (Trang 31 - 37)

Đối với từng kiểu dữ liệu khác nhau thì việc lựa chọn các hệ quản trị cơ sở dữ liệu phục vụ việc lƣu trữ là rất quan trọng. Hiện nay hệ quản trị cơ sở dữ liệu đƣợc sử dụng nhiều nhất là các hệ quán trị cơ sở dữ liệu quan hệ (RDBMS, ví dụ điển hình nhƣ MySQL, Microsoft SQL Server,…). Trong thời gian gần đây, cùng với sự phát triển của Internet và nguồn thông tin khổng lồ phát sinh, đã xuất hiện một loại hệ quản trị cơ sở dữ liệu mới khác hoàn toàn với các loại trƣớc, đó chính là các hệ quản trị cơ sở dữ liệu không quan hệ NoSQL. Sau khi nghiên cứu, tôi đã sử dụng cả hệ quản trị cơ sở dữ liệu quan hệ và không quan hệ phục vụ cho mục đích lƣu trữ khác nhau của mình. Phần tiếp theo luận văn sẽ trình bày về các hệ quản trị cơ sở dữ liệu này.

2.2.2.1. Hệ cơ sở dữ liệu NoSQL

NoSQL là thế hệ cơ sở dữ liệu không ràng buộc (non-relational), phân tán (distributed), mã nguồn mở, và có khả năng mở rộng theo chiều ngang – có nghĩa là có thể mở rộng khả năng lƣu trữ và xử lý bằng cách thêm nhiều máy phân tán [7]

vào hệ thống lƣu trữ gọi là các node. Các dữ liệu thƣờng sẽ đƣợc chia nhỏ để lƣu trữ ở nhiều máy vật lý khác nhau, mỗi phần dữ liệu bản thân nó cũng đƣợc nhân làm nhiều bản để lƣu ở các vị trí khác nhau. Hệ quản trị NoSQL cho phép tăng khả năng lƣu trữ hơn trên nhiều máy khác nhau và tăng tốc độ xử lý truy vấn. Nó phân tán, sẵn sàng xử lý khi có tình huống mất mát dữ liệu logic hay do lỗi phần cứng[6].

Với đặc thù các tin bài trên Internet là số lƣợng lớn, sẽ không có các sự ràng buộc lẫn nhau giữa các tin bài. Một hệ quản trị cơ sở dữ liệu NoSQL rất hữu ích

trong khi làm việc với lƣợng dữ liệu lớn, không có nhiều mối liên hệ lẫn nhau. Nên với hệ thống của mình, tôi chọn sử dụng một hệ quản trị cơ sở dữ liệu NoSQL để lƣu trữ các tin bài trả về của hệ thống.

NoSQL chia làm rất nhiều loại nhƣ cụm các cột (Column Families )(tiêu biểu là Hadoop, Cassandra), lƣu trữ kiểu tài liệu (Document) (tiêu biểu là MongoDB), kiểu khóa/giá trị (Key/value) (tiêu biểu nhƣ DynamoDB), kiểu đồ thị (Graph)(nhƣ OrientDB), …

2.2.2.2. MongoDB

Hệ thống yêu cầu lƣu trữ một lƣợng dữ liệu rất lớn từ Internet, thƣờng xuyên cập nhật mỗi ngày do những thông tin mới phát sinh ra bất cứ thời gian nào trong ngày. Vì thế hệ thống yêu cầu một hệ quản trị cơ sở dữ liệu hỗ trợ lƣu trữ lớn, tốc độ lƣu trữ và tìm kiếm nhanh. Do thông tin trên internet không có cấu trúc chung cho tất cả, nên yêu cầu một hệ quản trị cơ sở dữ liệu lƣợc đồ linh hoạt hoặc phi lƣợc đồ. Vì vậy chúng tôi chọn một hệ quản trị cơ sở dữ liệu NoSQL. Trong số những hệ quản trị cơ sở dữ liệu NoSQL mã nguồn mở đang có, tôi ƣu tiên lựa chọn những hệ quản trị lƣu trữ theo mô hình Key/Value để có thể phù hợp với những dữ liệu cần lƣu trữ. MongoDB là một trong số đó.

MongoDB [17] là một hệ quản trị cơ sở dữ liệu mã nguồn mở, và đƣợc đánh giá là một hệ quản trị cơ sở dữ liệu có hiệu năng cao, thiết kế lƣợc đồ tự do, hay không có lƣợc đồ quan hệ. MongoDB là hệ quản trị cơ sở dữ liệu hƣớng Document. Thay vì lƣu trữ dữ liệu dƣới dạng bảng và các tuple nhƣ trong các cơ sở dữ liệu quan hệ, nó lƣu trữ dữ liệu là các document dƣới dạng JSON, cụ thể MongoDB lƣu trữ dƣới dạng gọi là BSON vì nó lƣu trữ ở dạng binary từ một JSON document. Trong MongoDB, các Collections tƣơng ứng với các bảng (tables), các cặp key/value tƣơng ứng với các cột và hàng trong cơ sở dữ liệu quan hệ. Nó không hỗ trợ khóa ngoại và không có phép Join, Trigger, Proceduce.

Ví dụ về document: {[{ “name”: “Bill”, “jobs”: [{ “name”: “Tester”, “company”: “UET” } { “name”: “Developer”, “company”: “UET” } ] }

MongoDB đƣợc phát triển bằng C++, hỗ trợ bản cài đặt chạy đƣợc trên nhiều hệ điều hành nhƣ Linux, Windows, MacOS X, Solaris. Về chức năng, MongoDB không đáp ứng đủ các tiêu chuẩn ACID, nhƣng bù lại nó hỗ trợ mạnh mẽ cho việc mở rộng bằng sharding, nên hệ thống có thể chạy trên nhiều máy tính, tự động cân bằng tải, tự động nhân bản dữ liệu để đảm bảo hệ thống vẫn chạy tốt trong trƣờng hợp lỗi phần cứng.

Các tính năng của MongoDB[8]:

 Document data model with dynamic schemas  Full, flexible index support and rich queries  Auto-Sharding for horizontal scalability  Built-in replication for high availability  Text search

 Advanced security

 Aggregation Framework and MapReduce  Large media storage with GridFS

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).

Hình 2.3: Lưu trữ dữ liệu dạng BSON

MongoDB hỗ trợ các thƣ viện cho các ngôn ngữ lập trình: C, C++, Erlang, Java, Javascript, .NET, Node.js, PHP, Python, Ruby,…

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

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:"Elementaryeries"}) (adsbygoogle = window.adsbygoogle || []).push({});

{

"_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).

{ "_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")); 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ờ những ƣu điểm trên mà tôi lựa chọn MongoDB cho hệ thống của mình.

Một phần của tài liệu Đánh giá và thu thập thông tin tự động trên internet sử dụng dịch vụ tìm kiếm (Trang 31 - 37)