CHƯƠNG 2: MÔ HÌNH KIẾN TRÚC TỔNG THỂ VÀ MỘT SỐ THUẬT TOÁN ĐÁNH GIÁ THÔNG TIN
2.2. Các kỹ thuật chính
2.2.2. Hệ quản trị dữ liệu MongoDB
Đố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"}) {
"_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"));
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.