GIT – Giới thiệu [] : chắc hẳn có nhiều người ngờ ngợ với . Nó là cái gì? Nghe nó quen quen. Nó dùng để làm gì?…
Ở đây, tôi chỉ nói những gì về NoSQL mà tôi hiểu được theo một cách đơn giản nhất, và không nặng về lý thuyết [tôi cũng chán học lý thuyết lắm], nhưng ít nhất bạn cũng cần phải biết sơ sơ nó là gì đã. Nếu có sai sót gì thì mong các bạn góp ý. Xin cám ơn!

1. Giới thiệu
NoSQL có nghĩa là Non-Relational (NoRel) – không ràng buộc – tuy nhiên, người ta thường dịch làNot Only SQL. Nói một cách đơn giản nhất, NoSQL là cơ sở dữ liệu mà không dùng mô hình dữ liệu quan hệ [Mô hình dữ liệu quan hệ là gì thì các bạn đi học môn CSDL đều biết rồi ha].
Có rất nhiều hệ thống sử dụng NoSQL như thì có Cassandra, thì có BigTable… Ở đây, tôi xin giới thiệu MongoDB [http://www.mongodb.org/]. Lý do tôi chọn MongoDB giữa một rừng CSDL là vì nó miễn phí, hỗ trợ .NET và cộng đồng cũng kha khá. Về cách cài đặt thì vô cùng đơn giản [quá thích], tôi sẽ giới thiệu sau.
2. Ví dụ
Để dễ hình dung hơn về NoSQL [từ nay tôi sẽ gọi là MongoDB], tôi có một ví dụ như sau [ví dụ này tôi lấy của người khác vì tôi thấy nó đơn giản và khá dễ hiểu]:
Một cửa hàng bán đĩa [bán gì cũng được] cần lưu danh sách khách hàng và chi tiết hóa đơn mua hàng.
Chỉ vậy thôi. Ví dụ đơn giản và rất quen đúng không?
Nếu theo cách thông thường, sử dụng SQL, bạn sẽ thiết kế table như sau:

Biểu đồ mối quan hệ giữa các bảng [table] trong SQL

Đối với MongoDB, bạn không cần thiết kế bảng [table], mà bạn thiết kế các lớp [class], table sẽ được tự động sinh ra trong MongoDB [cơ câu của nó vốn thế]. Điều này khác nhau thế nào, tôi sẽ nói rõ hơn nhưng trước tiên hãy xem hình:

Biểu đồ tương quan giữa các lớp [class] trong MongoDB

Bạn để ý là có chữ “Class” ở dưới mỗi tên và đừng nhầm lẫn đây là bảng [table].
Ở đây ta có 2 class [tôi sẽ sử dụng tiếng Anh cho các từ thông dụng] là Customer và Order.
Bạn sẽ thắc mắc rằng, thế mối quan hệ giữa Customer và Order ở đâu?
Bạn hãy chú ý chỗ nối giữa 2 class có chữ Orders, đừng nhầm lẫn nhé, Orders chứ không phải Order [tiếng Anh nó thế], nghĩa là ở đó có có nhiều Order. Thêm vào đó, trước chữ Orders là biểu tượng  , nghĩa là Orders là một property trong class Customer.
Đến đây, bạn có hình dung ra mình sẽ sử dụng cái gì không? Ở đây, tôi sử dụng cách đơn giản nhất đó là List<>.
Chà, nãy giờ có vẻ lẫn lộn giữa CSDL và Coding, nhưng bạn cứ yên tâm, đây chỉ là ví dụ và tôi đang cố gắng diễn giải cho đơn giản. Về sau này, khi đã nắm cơ bản rồi thì bạn có thể làm bất cứ gì theo ý mình.
Và đây là code định nghĩa class:

public class Order
{
    public ObjectId _id { get; set; }
    public int Quantity { get; set; }
}
public class Customer
{
    public ObjectId _id { get; set; }
    public string Name { get; set; }
    public List<Order> Orders { get; set; }
    public Customer()
    {
        Orders = new List<Order>();
    }
}

Trong class Customer ta có thuộc tính List<Order> Orders, nghĩa là ngoài việc được lưu trong table Order, các Order còn được lưu trong table Customer. Ta có một số dữ liệu như sau:

Table Order

_id Quantity
1 45
2 664
3 11
4 22

  5

33

Table Customer

_id Name

Orders [List]

1

Steven

_id Quantity
1
4
45
22

2

David

_id Quantity
2
3
5
664
11
33

Đến đây bạn sẽ thắc mắc rằng, “Như thế thì cùng một dữ liệu mà phải lưu ở hai nơi à?” Tôi xin trả lời là đúng như vậy. Việc sử dụng MongoDB nói chung, và NoSQL nói riêng sẽ khiến ta chấp nhận sự không toàn vẹn dữ liệu.
Bạn sẽ phản đối “Nếu không toàn vẹn dữ liệu thì xài làm gì?” Hãy bình tĩnh, nếu không có lợi thì các “ông lớn” như Google, Facebook, IBM… đã không sử dụng và phát triển NoSQL. Chính vì thế, khi xây dựng một hệ thống, bạn cần phải tình toán xem mình sẽ sử dụng CSDL truyền thống hay NoSQL.
Bạn hãy xem hình sau, bạn đã bao giờ gặp trường hợp thế này?

Avatar trên Facebook của bạn khác nhau

Đây là một ví dụ điển hình về NoSQL. Khi bạn thay đổi avatar, một số nơi vẫn giữ avatar cũ, đơn giản là vì nó nằm ở một table khác và table đó chưa được cập nhật. Sau một khoảng thời gian, bạn xem lại thì đã thấy avatar mới. Nghĩa là, NoSQL có cơ chế đồng bộ hóa dữ liệu. Sự không toàn vẹn dữ liệu chỉ diễn ra trong một khoảng thời gian ngắn. Nhiều người đã chấp nhận điều này để đổi lấy tốc độc truy cập nhanh hơn, như bạn có thể thấy rằng Facebook có tốc độ cực khủng!
Về cơ chế đồng bộ thì mỗi nơi mỗi khác, tùy vào suy nghĩ của người thiết kế. Hiện tại tôi cũng đang trong quá trình tìm hiểu và thử xây dựng một cơ chế toàn vẹn dữ liệu cho CSDL của mình.

3. Thuận lợi
Một trong những thuận lợi tôi rất thích ở MongoDB là khả năng mở rộng theo chiều ngang [horizontal scalable], nghĩa là việc thêm column vào một table nào đó [chuyện này xảy ra như cơm bữa] là cực kỳ đơn giản.
Ví dụ ta có dữ liệu như sau:

[
    {"_id": "1", "Quantity": "45"},
    {"_id": "2", "Quantity": "664"},
    {"_id": "3", "Quantity": "11"},
    {"_id": "4", "Quantity": "22"}
]

Bạn sẽ thắc mắc rằng tại sao dữ liệu lại hiển thị như trên. Trông nó rất giống kiểu JSON đúng không? MongoDB là CSDL dạng document [bạn có thể xem phần 4], sử dụng key-value để lưu trữ. Đơn giản là bạn chỉ việc chấp nhận nó như thế.
Như định nghĩa class ở trên, bảng Order có 2 property là _id và Quantity. Bây giờ, bạn muốn thêm mã hàng hóa [ProductId] thì làm thế nào nhỉ?!
– SQL: Vào database -> thêm column -> sửa các câu truy vấn [nếu có], nhập liệu, khóa ngoại… và còn nhiều thứ nữa.
– MongoDB: Thêm 1 property mới vào class Order. Xong!

public class Order
{
    public ObjectId _id { get; set; }
    public int Quantity { get; set; }
    public int ProductId { get; set; }
}


Dữ liệu sau đó có thể được cập nhật như sau:

[
    {"_id": "1", "Quantity": "45"},
    {"_id": "2", "Quantity": "664"},
    {"_id": "3", "Quantity": "11"},
    {"_id": "4", "Quantity": "22"},
    {"_id": "5" , "Quantity": "33" , "ProductId": "PD001"}
]

4. Một số server NoSQL
– Wide Column Store/Column Families: BigTable – Google, Cassandra – Facebook/Apache, Hypertable – Zvents Inc/Baidu, Cloudera, SciDB, Mnesia, Tablets…
– Key-Value Store/Tuple store: Berkeley DB, Dynamo, Cassandra,  Azure Table Storage…
– Document Store: Apache Jackrabbit, CouchDB, IBM Lotus Notes Storage Format (NSF),  MongoDB…
– Graph Database: Neo4J, Sones, InfoGrid, AllegroGraph…

Download ebook MongoDB

MongoDB direct link MongoDB-www.gocit.vn.pdf

MongoDB Development direct link MongoDB-Developers-www.gocit.vn.pdf

MongoDB Cloud direct link MongoDB-Cloud-www.gocit.vn.pdf

Tham gia thảo luận bài viết tại forum : http://forum.gocit.vn/threads/gioi-thieu-mongodb-nosql.300/

Print Friendly

Comments

comments

Bài viết liên quan