Cơ sở dữ liệu NoSQL là gì ?
Cơ sở dữ liệu NoSQL là Cơ sở dữ liệu được xây dựng dành riêng cho mô hình dữ liệu và có sơ đồ linh hoạt để xây dựng các ứng dụng hiện đại. Cơ sở dữ liệu NoSQL được công nhận rộng rãi vì khả năng dễ phát triển, chức năng cũng như hiệu năng ở quy mô lớn. Các Cơ sở dữ liệu này sử dụng nhiều mô hình dữ liệu đa dạng, trong đó có văn bản, đồ thị, khóa – giá trị, trong bộ nhớ và tìm kiếm. Bài viết này có các tài nguyên giúp bạn hiểu thêm về cơ sở dữ liệu NoSQL và cách bắt đầu sử dụng trong các dự án thu thập dữ liệu IoT.
Vì sao bạn nên sử dụng cơ sở dữ liệu NoSQL ?
Cơ sở dữ liệu NoSQL là lựa chọn cực kỳ thích hợp cho nhiều ứng dụng hiện đại, ví dụ như di động, web và trò chơi đòi hỏi phải sử dụng cơ sở dữ liệu cực kỳ thiết thực, linh hoạt, có khả năng thay đổi quy mô và hiệu năng cao để đem đến cho người dùng trải nghiệm tuyệt vời.
- Linh hoạt: Cơ sở dữ liệu NoSQL thường cung cấp các sơ đồ linh hoạt giúp công đoạn phát triển nhanh hơn và có khả năng lặp lại cao hơn. Mô hình dữ liệu linh hoạt biến cơ sở dữ liệu NoSQL thành lựa chọn lý tưởng cho dữ liệu không được tổ chức thành cấu trúc hoặc có cấu trúc chưa hoàn chỉnh.
- Khả năng thay đổi quy mô: Cơ sở dữ liệu NoSQL thường được thiết kế để tăng quy mô bằng cách sử dụng các cụm phần cứng được phân phối thay vì tăng quy mô bằng cách bổ sung máy chủ mạnh và tốn kém. Một số nhà cung cấp Cloud Service xử lý các hoạt động này một cách không công khai dưới dạng dịch vụ được quản lý đầy đủ.
- Hiệu năng cao: Cơ sở dữ liệu NoSQL được tối ưu hóa theo mô hình dữ liệu (ví dụ như văn bản, khóa–giá trị và đồ thị) và các mẫu truy cập giúp tăng hiệu năng cao hơn so với việc cố gắng đạt được mức độ chức năng tương tự bằng cơ sở dữ liệu quan hệ.
- Cực kỳ thiết thực: Cơ sở dữ liệu NoSQL cung cấp các API và kiểu dữ liệu cực kỳ thiết thực được xây dựng riêng cho từng mô hình dữ liệu tương ứng.
Trước NoSQL, từng có một thứ gọi là … SQL
Nhắc lại một chút, database (DB) là một cơ sở dữ liệu, gồm các bảng, hàng, cột. Những thứ mình sẽ nhắc đến trong bài như: MySQL, Microsoft SQL server, MongoDB, .. là hệ quản trị cơ sở dữ liệu (DBMS). Các bạn đừng nhầm lẫn 2 khái niệm này.
Thật ra, SQL không phải là … DB, cũng không phải là DBMS. Nó là viết tắt của Structure Query Language (Ngôn ngữ truy vấn cấu trúc). Ngôn ngữ này truy vấn trên nền một RDBMS (Hệ quản trị CSDL quan hệ). Đây là thứ các bạn sinh viên được dạy trong môn “Cơ sở dữ liệu”.
Trong RDBMS, dữ liệu được lưu vào nhiều bảng. Mỗi bảng sẽ có nhiều cột, nhiều row. Ta sử dụng SQL để truy vấn như sau:
1
|
SELECT Name , Age FROM Students WHERE Score > 8 |
RDBMS (MySQL, Microsoft SQL Server, Oracle, …) được sử dụng rất rộng rãi, trong hầu hết các ứng dụng, vì một số lý do sau:
- Tính ACID (Atomicity, Consistency, Isolation, Durability) của một transaction được đảm bảo.
- Với database chuẩn 3, dữ liệu được đảm bảo tính đồng nhất và toàn vẹn (consistency).
- Có rất nhiều driver cho mọi ngôn ngữ: Java, C#, PHP.
- Số lượng lập trình viên biết và dùng SQL rất nhiềuuuuuuuuu.
Sau SQL, có một thứ gọi là … NoSQL
Tuy nhiên, RDBMS vẫn còn một số khuyết điểm:
- Việc mapping giữa các bảng trong database với các object trong code khá rắc rối và phức tạp. (Mặc dù 1 số ORM như Entity Framework, Hibernate đã đơn giản hóa chuyện này).
- Performance sẽ bị chậm khi phải join nhiều bảng để lấy dữ liệu (Đó là lý do ta sử dụng “giảm chuẩn” để tăng hiệu suất cho RDBMS).
- Việc thay đổi cấu trúc dữ liệu (Thêm/xóa bảng hoặc thêm/xóa một field) rất mệt mỏi, kéo theo vô số thay đổi trên code.
- Không làm việc được với dữ liệu không có cấu trúc (un-structure).
- RDBMS được thiết kế để chạy trên một máy chủ. Khi muốn mở rộng, nó khó chạy trên nhiều máy (clustering).
NoSQL Database (Phải là NoSQL Database nhé) ra đời, giải quyết được những khuyết điểm của RDBMS:
- Dữ liệu trong NoSQL DB được lưu dưới dạng document, object. Truy vấn dễ dàng và nhanh hơn RDBMS nhiều.
- NoSQL có thể làm việc hoàn toàn ok với dữ liệu dạng không có cấu trúc.
- Việc đổi cấu trúc dữ liệu (Thêm, xóa trường hoặc bảng) rất dễ dàng và nhanh gọn trong NoSQL.
- Vì không đặt nặng tính ACID của transactions và tính nhất quán của dữ liệu, NoSQL DB có thể mở rộng, chạy trên nhiều máy một cách dễ dàng.
Trong tương lai, NoSQL sẽ … thế chỗ SQL ???
Tóm lại, NoSQL database chỉ là một kiểu database có cách lưu trữ, truy vấn dữ liệu hoàn toàn khác so với RDBMS và SQL. NoSQL bỏ qua tính toàn vẹn của dữ liệu và transaction để đổi lấy hiệu suất nhanh và khả năng mở rộng (scalability). Với những ưu điểm trên, NoSQL đang được sử dụng nhiều trong các dự án Big Data, các dự án Real-time, số lượng dữ liệu nhiều.
Liệu NoSQL có thay thế được hoàn toàn RDBMS và SQL được không? Câu trả lời là KHÔNG. Trong tương lai, RDBMS vẫn sẽ giữ được chỗ đứng của mình. Một ứng dụng không chỉ sử dụng một database duy nhất, và có thể kết hợp cả SQL lẫn NoSQL.
Các dạng Database NoSQL
Hiện nay, trên thị trường có khá nhiều NoSQL Database Management System: MongoDB, RavenDB, Redis, Neo4j,… Ta có thể chia NoSQL thành 4 loại:
- Key-Value Database
- Document Database
- Column-Family Database
- Graph Database
Key-Value Database
Giới thiệu: Dữ liệu được lưu trữ trong database dưới dạng key-value, giống như một Dictionary trong C#. Để truy vấn dữ liệu trong database, ta dựa vào key để lấy value ra. Các database dạng này có tốc độ truy vấn rất nhanh.
Database tiêu biểu: Riak, Redis, MemCache, Project Voldemort, CouchBase
Ứng dụng: Do tốc độ truy xuất nhanh, key-value database thường được dùng để làm cache cho ứng dụng (Tiêu biểu là Redis và MemCache). Ngoài ra, nó còn được dùng để lưu thông tin trong sessions, profiles/preferences của user…
Document Database
Giới thiệu: Mỗi object sẽ được lưu trữ trong database dưới dạng một document. Dữ liệu sẽ được lưu trữ dưới dạng BSON/JSON/XML dưới database. Dữ liệu không schema cứng như SQL, do đó ta có thể thêm/sửa field, thay đổi table, … rất nhanh và đơn giản. Database dạng này có tốc độ truy vấn nhanh, có thể thực hiện các câu truy vấn phức tạp, dễ mở rộng (scalability). Mỗi database có một kiểu truy vấn riêng, khá là loạn xà ngầu (RavenDB dùng Lucene, MongoDB lại dùng query document).
Database tiêu biểu: MongoDB, RavenDB, CouchDB, TerraStone, OrientDB
Ứng dụng: Do nhanh và linh động, document database thường đóng vài trò làm database cho các ứng dụng prototype, big data, e-commerce, CMS. Ngoài ra, ta còn dùng nó để lưu log hoặc history. Mình khuyên các bạn nên thử học MongoDB hoặc RavenDB nhé.
Column-Family Database
Giới thiệu: Dữ liệu được lưu trong database dưới dạng các cột, thay vì các hàng như SQL. Mỗi hàng sẽ có một key/id riêng. Điểm đặt biệt là các hàng trong một bảng sẽ có số lượng cột khác nhau. Câu lệnh truy vấn của nó khá giống SQL.
Database tiêu biểu: Cassandra (Phát triển bởi Facebook), HyperTable, Apache HBase
Ứng dụng: Column-Family Database được sử dụng khi ta cần ghi một số lượng lớn dữ liệu, big data. Nó còn được ứng dụng trong 1 số CMS và ứng dụng e-commerce.
Graph Database
Giới thiệu: Dữ liệu trong graph database được lưu dưới dạng các node. Mỗi node sẽ có 1 label, 1 số properties như một row trong SQL. Các node này được kết nối với nhau bằng các relationship. Graph database tập trung nhiều vào relationship giữa các node, áp dụng nhiều thuật toán duyệt node để tăng tốc độ.
Database tiêu biểu: Neo4j, InfiniteGraph, OrientDB, HYPERGRAPHDB
Ứng dụng: Khi cần truy vấn các mối quan hệ, graph database truy vấn nhanh và dễ hơn nhiều so với database. Nó được dùng trong các hệ thống: mạng nơ ron, chuyển tiền bạc, mạng xã hội (tìm bạn bè), giới thiệu sản phẩm (dựa theo sở thích/lịch sử mua sắm của người dùng)… Neo4j là một database free, lại có một cộng đồng rất lớn, với vô số bài hướng dẫn, các bạn nên học thử.
Mapping thuật ngữ trong Relational Database và NoSQL database
RELATIONAL | KEY-VALUE (RIAK) | DOCUMENT (MONGODB) | COLUMN-FAMILY (CASSANDRA) | GRAPH (NEO4J) |
---|---|---|---|---|
instance | cluster | mongod | cluster | instance |
table | bucket | collection | column-family | label |
row | key-value | document | row | node |
row-id | key | _id | ||
schema | database | schema |
Bảng này chỉ có tính tương đối. Các node trong Graph DB không có key, mà các properties của nó sẽ đóng vai trò thay thế key.
Xu thế trong tương lai – Polyglot persistance
Như mình đã phân tích, NoSQL DB sẽ không thể nào thay thế được hoàn toàn RDBMS. Ngày trước, toàn bộ dữ liệu của một ứng dụng đều được lưu trữ dưới SQL Database.
Giờ đây, NoSQL sẽ dần chiếm vị trí của RDBMS. Một số chức năng của ứng dụng không quá coi trọng tính toàn vẹn của dữ liệu, nhưng lại cần tốc độ truy vấn nhanh, dễ truy vấn. Các chức năng này sẽ sử dụng NoSQL để truy vấn/lưu trữ dữ liệu.
Điều này tạo nên một xu hướng mới – áp dụng nhiều kiểu lưu trữ cho một ứng dụng, còn gọi là polyglot persistance. Các bạn đừng lo lắng kiến thức SQL của mình sẽ lỗi thời, vì cái ngày NoSQL chiếm chỗ của RDBMS còn lâu lắm.
Bài viết lấy nguồn từ toidicodedao.com