12/08/2018, 12:10

Những điều cơ bản liên quan đến Document database mà một nhân viên phát triển nên biết.

(Tài liệu sử dụng “MongoDB” làm cơ sở giải thích và dùng cho những nhân viên phát triển chưa từng làm việc với document database) Đặc trưng lớn nhất của database document chính là “cung cấp một thiết lập đơn giản (simple set) để xử lí các vấn đề như performance, dữ liệu số ...

(Tài liệu sử dụng “MongoDB” làm cơ sở giải thích và dùng cho những nhân viên phát triển chưa từng làm việc với document database)

Đặc trưng lớn nhất của database document chính là “cung cấp một thiết lập đơn giản (simple set) để xử lí các vấn đề như performance, dữ liệu số lượng lớn, scalable,...”

Đương nhiên các renational database (cơ sở dữ liệu quan hệ) hiện tại (sau đây gọi tắt là RDB) cũng có khả năng thực hiện tương tự các chức năng đặc trưng mà document database được trang bị, ngoài ra nó còn cung cấp thêm các chức năng và khái niệm ở phạm vi rộng hơn. Ví dụ: Sharding cũng có khả năng phân giải dữ liệu bằng nhiều RDB hiện tại. Tuy nhiên, ở document database đặc trưng “cấu trúc dữ liệu ngay từ ban đầu phù hợp với cấu hình như này” và “ý tưởng đơn giản” cũng chính là các đặc trưng ưu tiên.

Nhiều người có thể hiểu rõ về chức năng cũng như hoạt động của database, thậm chí có thể điều chỉnh nó cho phù hợp nhất nhưng việc thực hiện những điều này lại không hề đơn giản. Vấn đề không phải là “ có thể hay không thể” mà chính là “việc có tối ưu hóa để đạt đươc mục đích hay không”. Tóm lại, điểm mấu chốt quan trong ở đây chính là việc document database cung cấp “một tập hợp chức năng đơn giản” cho các ứng dụng, hướng đối tượng chỉ định.

Ở bài viết sẽ lấy “MongoDB” làm ví dụ cho document database (=database định hướng document), và viết cho đối tượng là những kĩ thuật viên chưa có kinh nghiệm làm việc với document database.

Nền móng cơ sở của document database####

Bản thân MongoDB chính là document database có “đặc trưng sẵn có”. Chính vì vậy, nửa đầu của bài viết này sẽ sử dụng MongoDB để giải thích, nửa sau của bài viết sẽ đề cập đến các document database khác. Trong bài viết này tôi cũng sẽ cố gắng thể hiện những đặc trưng vốn có của MongoDB. Ngoài ra, mục đích của bài viết này không phải là để giải thích về cách sử dụng MongoDB, vì vậy việc giải thích liên quan đến các phương pháp setup cơ bản như cách cài đặt,...sẽ được giản lược.

Đầu tiên tôi sẽ bắt đầu từ những khái niệm cơ bản của document database.

Khái niệm 「DB」「collection」「Object (=document)」####

Ở MongoDB sẽ vận dụng các khái niệm 「DB (=database) (dbs)」「Collection」「Object =Document. Sau đây sẽ gọi tắt là Object」

Ví dụ: Trường hợp sử dụng DB là “testdb” theo Command-line utility “mongo” (=mongo.exe file) của MongoDB, sẽ thực hiện command như dưới đây (ngoài ra, khi thực hiện command dưới nếu DB chưa được tạo thì DB đầu tiên có chứa object, đối tượng của collection sẽ được tạo.)

mongo localhost:27017

> use testdb;

Vd: input command line trong trường hợp sử dụng DB là “testdb” trên server “27017” port theo command “mongo”

Điểm đặc trưng nhất của document database khác với RDB chính là không có lược đồ (schema), vì vậy có thể đăng kí cùng một object cho nhiều loại khác nhau.

Ví dụ, trường hợp insert object vào collection “Order” của “testdb” sẽ thực hiện command như dưới đây (ở bước này, DB đầu tiên và đối tượng collection là “Orders” sẽ được tạo và Object sẽ được lưu lại ở đó là “obj 1”). Thay vì đăng kí object đã được xác định trước thì có thể đăng kí trực tiếp đăng kí object vô danh (ngoài ra cũng có thể đăng kí object khác nhau cho cùng một collection)

> obj1 = { Name : "test1", Price : 100, Category : "material" };

> db.Orders.save(obj1);

Insert object bằng cách gọi save method của Orders collection trong testdb.

Nhìn vào “obj1” ta hiểu rằng định dạng dữ liệu của MongoDB là JSON (Javascript Object Notation).

Key-Value Store####

> db.Orders.find()

Để lấy toàn bộ Object đã được đăng kí thì dùng lệnh như ở dòng trên.

{ "_id" : ObjectId("5080df68758966a4fcc6d235"), "Name" : "test1", "Price" : 100, "Category" : "material" }

Nhìn vào kết quả thu được, ta thấy rằng mỗi một Object trả về đều có 1 ObjectId là khóa chính (primary key). Trong MongoDB thì key này được khai báo ở “_id”, như vậy bắt buộc phải cung cấp Key (nếu là MongoDB thì là “_id” đã định trước) ở document - database là database “NoSQL” đã sử dụng theo dạng Key - Value.

Thu được toàn bộ Object bằng cách gọi find method của Orders Collection.

Theo cấu tạo của Key - Value này, object cụ thể sẽ được tốc độ hóa, Scalability (khả năng mở rộng) cũng sẽ được thực hiện. Khi thực hiện các đặc trưng này thì nhất thiết không thể thiếu được sự tồn tại của Key.

Bên cạnh đó, ở document database cũng có thể bổ sung Key cho các object cụ thể như này tùy theo index. Điều này có nghĩa là các “_id” được sử dụng ở đây nên là “1 key được phân bổ ngay từ đầu” (đương nhiên, ở trong MongoDB cũng sử dụng “_id” này ở mọi chỗ, đây là Key có tính chất hoàn toàn khác so với các Key khác dùng để phân biệt các Object với nhau và giá trị của nó luôn luôn là duy nhất)

Chức năng search####

Ở MongoDB có thể search đơn giản. Ví dụ, ở Orders collection bên trên, khi search name filde có giá trị là “test 1” sẽ thực hiện như sau:* (ở MongoDB, nếu không tạo index rõ ràng thì khi search sẽ gặp nhiều khó khăn)*

> db.Orders.find({Name:"test1"});

Chỉ định giá trị search cho parameter, gọi find method trong Orders collection và thực hiện search object cụ thể.

Trường hợp search object có giá trị Price field vượt quá 50 thì sẽ thực hiện như dưới đây. “gt” sẽ mang ý nghĩa “greater than” (nghĩa là “lớn hơn.....”). Ngoài ra, “and” (và), “or” (hoặc) đương nhiên cũng sẽ chỉ định operator có điều kiện như là “all” (tất cả), “$$xsists” (tồn tại),... và thực hiện nhiều dạng search.

 db.Orders.find({Price: {$gt: 50}});

Chỉ định điều kiện và thực hiện search.

Điều khiển các ngôn ngữ để kết nối MongoDB

  • MongoDB là database xem xét mối quan hệ với các ngôn ngữ lập trình khác như sử dụng Object - format (=Notation) có JSON làm cơ sở. Trên thực tế có thể kết nối với MongoDB từ nhiều loại ngôn ngữ lập trình (Vd như 「C」「C++」「Erlang」「Haskell」「Java」「Javascript」「.NET(C#/F#/PowerShell vv...」「Node.js」「Perl」「PHP」「Python」「Ruby」「Scala」vv...)

Khi kết nối với MongoDB từ các chương trình bên ngoài sẽ phải sử dụng phương thức protocol riêng nên công cụ chuyên dụng dành cho ngôn ngữ phát triển sẽ được cung cấp. Đối với lập trình viên .NET, công cụ dành cho ngôn ngữ C# là Official MongoDB C# driver (dưới đây sẽ viết tắt là C# driver) sẽ do công ty MongoDB 10gen cung cấp. (C# driver có thể lấy từ NuGet).

Cài đặt C# driver thông qua NuGet

Sử dụng C# làm thử nghiệm, nếu viết giống như xử lí trong việc thực hiện command line trên (tạo và search object) sẽ có dòng code như sau:

using System;
using MongoDB.Driver;
using MongoDB.Bson;

class Program
{
  static void Main(string[] args)
  {
    MongoServer server = MongoServer.Create(@"mongodb://localhost");#mongo localhost:27017
    MongoDatabase db = server["testdb"];#use testdb;

    MongoCollection<Order> col = db.GetCollection<Order>("Orders"); #db.Order;

    // save method
    Order obj1 = new Order()
    {
      Name = "test1",
      Price = 100,
      Category = "material"
    };
    col.Insert(obj1);#db.Order.save(“obj1”);

    // find method
    MongoCursor<Order> sel1 = col.FindAll();#db.Order.find();
    foreach (var item in sel1)
    {
      Console.WriteLine("_id : {0}, Name : {1}", item._id, item.Name);
    }

    Console.ReadLine();
  }
}

public class Order
{
  public ObjectId _id { get; set; }
  public string Name { get; set; }
  public int Price { get; set; }
  public string Category { get; set; }
}

Ví dụ về code C# sử dụng C# driver tạo Object và thực hiện search (console application)

Sự tiện dụng của「MongoDB」+「C#」+『LINQ』####

Ngoài ra, nếu bạn đã sử dụng C# thì tôi muốn bạn tận dụng hết những lợi điểm của ngôn ngữ này. Những lập trình viên C# có thể thực hiện Ad - hoc query một cách trực quan hơn việc sử dụng LINQ thông dụng. Đối với version trước của MongoDB (trước version 1.4) thì chỉ có thể sử dụng library FluectMongo thêm vào khi dùng LINQ. Tuy nhiên, đối với C# driver hiện tại thì nó đã bao gồm tiêu chuẩn là phương thức mở rộng dùng cho LINQ (ngoài ra, tôi cũng muốn các bạn chú ý rằng những cái này là không đồng nhất. Ví dụ: có thể tự động tạo MapReduce view từ query,...)

Chúng ta hãy cùng thử viết chương trình MongoDB + LINQ. Ví dụ, sử dụng LINQ của C# driver để viết code cho phần FindAll method trên:

`using System.Linq;
using MongoDB.Driver.Linq;

// find (Linq)
var sel1 = from c in col.AsQueryable<Order>()
           select c;
foreach (var item in sel1)
{
  Console.WriteLine("_id : {0}, Name : {1}", item._id, item.Name);
}`

Ví dụ: code MongoDB+LINQ (trích 1 phần đoạn code)

Trường hợp tìm kiếm bằng tên sẽ thực hiện như sau. So với cũ pháp JQuery đã có ở MongoDB phía trên, thì nó có thể xử lí MongoDB bằng cú pháp giống như SQL.

// find (Linq)
var sel1 = from c in col.AsQueryable<Order>()
  where c.Name == "test1"
  select c;

Ví dụ về dòng code xử lí MongoDB bằng các cú pháp tương tự với SQL như chỉ định điều kiện where.

Ngoài ra, ở đây cũng đã lược bỏ phần chi tiết nhưng các bạn có thể tham khảo thêm về cú pháp LINQ có thể sử dụng ở C# driver ở 「CSharp Driver LINQ Tutorial」của mongoDB.org.

[Trích nguồn: http://www.atmarkit.co.jp/ait/articles/1211/09/news056.html]

0