Trong bài viết này, tôi cố gắng đưa ra những thông tin cần thiết về NoSQL. NoSQL là gì? NoSQL để làm gì? Tại sao phải dùng NoSQL?...và giới thiệu về MongoDB.
Tôi không đi sâu vào những vấn đề như: NoSQL ra đời năm bao nhiêu, ai là cha đẻ của NoSQL hay quá trình phát triển của nó. Bạn có thể tìm kiếm các tài liệu liên quan đến NoSQL rất nhiều từ trên mạng. Vì vậy, tôi chỉ tập trung vào những điều cốt lõi để tạo bước đẩy cho chúng ta thao tác với NoSQL và MongoDB khi làm việc với Java. (Vì đây là blog về Java).
Do đó, nếu bạn chưa biết tới NoSQL hay lần đầu làm việc với MongoDB thì trước tiên bạn nên tìm kiếm và đọc những tài liệu liên quan tới nó.
1. NoSQL là gì?
NoSQL là 1 dạng CSDL mã nguồn mở không sử dụng T-SQL để truy vấn thông tin. NoSQL viết tắt bởi: None-Relational SQL, hay có nơi thường gọi là Not-Only SQL.NoSQL được phát triển trên Javascript Framework với kiểu dữ liệu là JSON và dạng dữ liệu theo kiểu key và value (1 đặc trưng về dữ liệu trong JSON). NoSQL ra đời như là 1 mảnh vá cho những khuyết điểm và thiếu xót cũng như hạn chế của mô hình dữ liệu quan hệ RDBMS về tốc độ, tính năng, khả năng mở rộng, memory cache,...
Chắc hẳn, bạn đã sử dụng 1 dạng CSDL quan hệ nào đó trước khi đọc bài viết này của tôi, có thể là: SQL Server, MySQL. Và tất nhiên không ít lần bạn vất vả trong việc chỉnh sửa các bảng dữ liệu khi liên quan tới khóa chính và khóa ngoại, hay 1 loạt các rắc rối khác trong quá trình làm việc. Bởi đó là CSDL quan hệ.
Với NoSQL bạn có thể mở rộng dữ liệu mà không lo tới những việc như tạo khóa ngoại, khóa chính, kiểm tra ràng buộc, .v.v...Vì NoSQL không hạn chế việc mở rộng dữ liệu nên tồn tại nhiều nhược điểm như: sự phục thuộc của từng bản ghi, tính nhất quán, toàn vẹn dữ liệu,....nhưng chúng ta có thể chấp nhận những nhược điểm đó để khiến ứng dụng cải thiện hiệu suất cao hơn khi giải quyết những bài toán lớn về hệ thống thông tin, phân tán hay lưu trữ dữ liệu.
Với các CSDL quan hệ, chi phí triển khai cũng như phát triển các ứng dụng sử dụng CSDL quan hệ cũng rất tốn kém và điều quan trọng được bộc lộ rõ khi truy vấn 1 lượng bản ghi lớn trong thời gian rất dài. Tiếp đó những thiết bị cầm tay như smartphone thì không phù hợp để triển khai CSDL quan hệ vì dung lượng bộ nhớ thấp và khả năng xử lý kém hơn máy tính. Và còn rất nhiều lí do khác nữa để chúng ta quyết định việc áp dụng NoSQL vào trong dự án của mình. Bạn có thể tham khảo thêm những thông tin khác về NoSQL trên mạng.
NoSQL được sử dụng ở đâu? NoSQL được sử dụng ở rất nhiều công ty, tập đoàn lớn, ví dụ như FaceBook sử dụng Cassandra do FaceBook phát triển, Google phát triển và sử dụng BigTable,...., và công ty mình đang làm việc sử dụng MongoDB.
Tham khảo: http://en.wikipedia.org/wiki/NoSQL
2. MongoDB là gì?
MongoDB là 1 hệ thống CSDL mã nguồn mở được phát triển và hỗ trợ bởi 10gen, là CSDL NoSQL hàng đầu được hàng triệu người sử dụng.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).
Các tính năng của MongoDB:
- 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
Trang chủ: http://www.mongodb.org/
10gen: http://www.10gen.com/
3. Cài đặt và sử dụng MongoDB.
Để sử dụng MongoDB, bạn lên trang chủ của MongoDB và tải về bản mới nhất tại đây.
Hiện tại khi viết bài này, tôi đang sử dụng Windows nên không đưa hướng
dẫn cài trên Ubuntu hay các hệ điều hành Linux khác. Tuy nhiên, bạn có
thể cài đặt MongoDB của 10gen thông qua câu lệnh apt-get trong
Ubuntu/Linux.
Khi tải xong, bạn giải nén file zip vừa tải về vào 1 thư mục nào đó
trên ổ cứng, có thể là ổ C, D,....nhưng theo tôi bạn nên đặt ở phân vùng
nào đó khác phân vùng windows, và đặt trong thư mục gốc. Ví dụ: D:\mongodb.
Để làm việc thuận tiện, tôi sẽ đặt Environment Variables tới thư mục mongodb này để sử dụng các công cụ của mongo thông qua Command Prompt ở bất kỳ đâu mà không cần phải thay đổi thư mục hiện hành để làm việc rồi mới có thể run các công cụ đó. Tôi làm như sau:
Sau khi cấu hình xong, tôi bật Command Prompt lên và bắt đầu
start mongo server, để thuận tiện hơn đỡ phải gõ lệnh mỗi khi làm việc
bạn có thể tạo 1 file .bat lưu nội dung câu lệnh bật mongo server để lần
sau chỉ việc click-n-run mà thôi.
Bình thường, tôi sẽ phải làm như sau để start server mongodb. (Nếu chưa có thư mục nào để lưu trữ database, bạn hãy tạo 1 thư mục nào đó, tôi thường đặt là data)
Ok, tôi đã bật xong mongodb server và nó đang lắng nghe, chờ đợi 1 yêu cầu nào đó kết nối tới cổng 27017 (cổng mặc định của mongodb) và cổng 28017 (cổng dành cho web admin).
Cảm thấy công việc quá nhàm chán và lặp đi lặp lại khi mỗi lần làm
việc phải gõ lệnh như này để start server. Tôi tạo 1 file có tên startmongo.bat
rồi ném vào đâu đó để sau này cần chạy mongodb thì không cần phải gõ
lệnh ở Command Prompt nữa (có thể ném vào ổ C:\Windows\, để chạy trực
tiếp trên hộp thoại Run cũng được). Tôi làm như sau:
Tiếp theo, tôi phải kết nối vào server để làm việc, tôi tiếp tục bật
Command Prompt và gõ lệnh, để tiện lợi hơn bạn có thể áp dụng tương tự
như bước trên là tạo ra 1 file .bat. Tôi làm như sau:
Gõ lệnh mongo tại cửa sổ Command Prompt.
Như bạn thấy, bên phía server đã nhận được 1 kết nối, và khi kết
nối thành công chúng ta được chuyển ngay tới 1 database mặc định là test.
Bây giờ tôi cần tạo 1 database và thêm vào 1 user để xác thực khi
đăng nhập để quản lý quyền hạn trên database mà tôi tạo ra. Tôi bắt tay
vào làm như sau:
Tôi gõ lệnh use myFirstDatabase và nhận được 1 thông báo từ phía server trả về là "đã chuyển sang database myFirstDatabase". Mặc dù hiện tại chưa hề có database nào tên myFirstDatabase nhưng
nhờ có cơ chế tự động cấp phát nên bạn sẽ được cấp phát trước và khi có
bất kỳ hành động nào tác động lên việc tạo mới hay chỉnh sửa database
đó Mongo sẽ bắt đầu tạo các file database thực sự cho ta. Ngay lúc này,
bạn có thể mở thư mục data lên và hoàn toàn thấy rằng không hề có file
nào tên myFirstDatabase.
Tiếp tục, tôi tạo 1 tài khoản để xác thực, tôi làm như sau:
Tôi đã có 1 tài khoản trong database này, tôi muốn được xác thực trước khi làm việc với database của tôi, tôi làm như sau:
Server phản hồi về 1 - tức là đã thành công. Tôi đã có được
database như mong muốn, tôi cần có nơi để lưu những thông tin, tôi nghĩ
ngay tới việc tạo 1 bảng nhưng bảng chỉ là 1 khái niệm trong CSDL quan
hệ, trong NoSQL không có khái niệm bảng, nó chỉ có khái niệm Collection
(rất gần gũi với Collection Framework trong Java). Collection sẽ có
nhiệm vụ lưu trữ và truy vấn thao tác trên các dữ liệu được lưu trong
nó, dữ liệu ở đây được phân chia thành các Document (trong CSDL
quan hệ được gọi là các tuples). Document là 1 đối tượng dạng JSON chứa
các key và value và ta có thể dễ dàng truy xuất giá trị thông qua các
key của đối tượng JSON đó.
Về cơ bản, tôi lập 1 bảng so sánh CSDL quan hệ với MongoDB như sau:
RDBMS | MongoDB |
---|---|
Database (.mdf, .ldf) | Database (.ns, .x với x = 1, 2, 3, 4, 5...) |
Tables | Collections |
Tuples | Documents |
Columns, Rows | Keys, values |
Indexes | Indexes |
Views, Functions, Procedures, Contraints, Triggers | Không có |
Primary Keys | ObjectId |
Foreign Keys | Không có |
Login | User Authenticate |
Để tạo 1 Collection (tức 1 bảng trong CSDL quan hệ), tôi làm như sau:
Tôi đã có được 1 Collection tên là Game dùng để lưu trữ thông
tin các Game mà tôi có, việc tiếp theo cần làm là tôi insert vào
Collection này những thông tin cần thiết. Tôi làm như sau:
Nền tảng của NoSQL là Javascript, nên các câu lệnh bạn thấy đều là cú pháp Javascript thôi, không có gì khó khăn cả.
Sau khi insert 2 game vào trong Collection, tôi muốn hiển thị xem có
thật là đã insert vào hay chưa, hoặc đại loại là tôi muốn liệt kê những
game mà tôi có. Tôi làm như sau:
Bây giờ, sau 1 thời gian ứng dụng chạy, và bắt đầu sinh ra những
thông tin khác cần thêm vào trong mỗi Document, tôi hoàn toàn có thể
scale nó dễ dàng mà không hề gặp rắc rối nào khác. Giả sử, tôi thêm vào 1
Game mới có thêm thông tin nào đó chẳng hạn, tôi làm như sau:
Bạn thấy dữ liệu thêm vào, không hề ảnh hưởng gì với những dữ liệu
cũ. Trong MongoDB, cái mà xác định duy nhất document là key _id.
Vì vậy nếu bạn muốn kiểm tra nghiệp vụ chi tiết hơn như kiểm tra xem tên
Game này đã có trong CSDL hay chưa, chưa có thì insert vào có rồi thì
báo lỗi chẳng hạn. Việc đó bạn phải validate ở tầng Bussiness Logic vì
bản thân MongoDB nó không hỗ trợ cơ chế đó như trong SQL Server hay
MySQL.
Tùy theo dự án, tùy vào trường hợp mà bạn phân tích cái gì thì sử
dụng CSDL quan hệ, cái gì thì sử dụng MongoDB để làm sao sử dụng đúng
mục đích đem lại hiệu quả cao. Ví dụ như quản lý thông tin người dùng
blog, tác giả bài viết, v.v.. bạn dùng CSDL quan hệ để quản lý, ok không
vấn đề gì, nhưng để tập hợp dữ liệu dùng để thống kê xem trong tháng
này có bao nhiêu người dùng Android, iOS, Firefox, Chrome, Opera Mini để
truy cập vào trang web của bạn chẳng hạn thì giải pháp tốt nhất bạn hãy
log lại những request đó vào MongoDB vì tác giả nhiều lắm cũng chỉ là 1
mình bạn hoặc vài chục người, bài viết cũng khoảng tầm vài nghìn bài
viết hoặc hơn cũng không sao vì CSDL quan hệ vẫn đủ tốt để xử lý. Nhưng
request từ người dùng thì là 1 vấn đề, số lượng có thể rất lớn so với
bài viết trên blog, vài triệu hoặc vài trăm triệu request (người dùng F5
liên tục thì còn chết nữa), lúc đó việc thống kê sẽ gặp rắc rối khi sử
dụng CSDL quan hệ vì chạy khá ì ạch, cho nên giải pháp dùng MongoDB có
lẽ tốt hơn hẳn. Đây cũng là 1 ví dụ thực tế điển hình mà bạn có thể va
vấp trong quá trình làm việc, và trong cuộc đời coder của mình.
Bài viết này chỉ là 1 bản chỉ đường (road-map) cho bạn để bạn biết
được NoSQL là gì?, MongoDB là gì?, ưu và nhược điểm của nó để giúp thúc
đẩy sự tò mò, tìm hiểu công nghệ của bạn. Bài viết không đi sâu vào
hướng dẫn chi tiết hay cover lại kiến thức có trên mạng hay trên các
trang blog khác và đảm bảo kiến thức nhất quán và phù hợp với thực tế.
Đây là 1 bản chỉ đường cho bạn khi tiếp cận với NoSQL, nên học gì?,
nên làm gì?, làm như nào? áp dụng ra sao? Việc bạn đi đúng hướng hay
không là do bạn quyết định. Tôi sẽ luôn chỉ đường để bạn thành công!