scrabsoftware | 0902.835.110 tư vấn miễn phí
  • Thiết kế website cho ca sĩ
    Thiết kế website cho ca ...
    Thiết kế website cho ca sĩ, nhạc sĩ ? Bạn là 1 ca sĩ chuyên nghiệp? Bạn muốn lập một website để PR thương hiệu ...
  • Thiết kế website cho nội thất, trang trí nội thất
    Thiết kế website cho nội ...
    Thiết kế website cho nội thất, trang trí nội thất? Là gói website dành cho lĩnh vực nội thất với những yêu cầu riêng biệt ...
  • Thiết kế website dạng điện máy, điện lạnh, điện tử...
    Thiết kế website dạng điện ...
    Thiết kế website dạng điện máy, điện lạnh, điện tử...Là một gói website tổng hợp và bao gồm các nghiệp vụ riêng biệt cho lĩnh ...
  • Thiết kế website giáo dục
    Thiết kế website giáo dục
    Kiến thức luôn là nền tảng cho mọi quyết định sáng suốt của con người. Ở SCRAB với tinh thần ham học hỏi và sự nố ...
  • Website thương mại điện tử
    Website thương mại điện tử
    Trong kỷ nguyên của côngnghệ thông tin hiện nay, việc mua bán sản phẩm không còn đơn thuần là rachợ hay đến siêu thị. Xu ...
  • Thiết kế website du lịch
    Thiết kế website du lịch
    Với kinh nghiệm qua nhiều website du lịch SCRAB thấu hiểu tầm quan trọng của website du lịch trong lĩnh vực này. Vàcam kết cung ...
  • Website khách sạn, nhà hàng
    Website khách sạn, nhà hàng
    Làm thế nào để khi khách hàng truy cập vào website của bạn, họ bị thuyết phục và đưa ra quyết định đặt phòng ngay? ...
  • Website Quảng cáo, rao vặt
    Website Quảng cáo, rao vặt
    Cung cấp một  giải pháp hoàn chỉnh đểngười có nhu cầu và người cung cấp nhu cầu có thể gặp nhau. doanh nghiệpvà người tiêu ...
  • Website Sàn GD Bất động sản
    Website Sàn GD Bất động ...
    Những giá trị mà giải pháp SCRAB mang lại cho Bạn: Giao diện đẹp, sáng tạo với bố cục hợp lý giúp người truy cập ...
  • Website Tòa soạn báo trực tuyến
    Website Tòa soạn báo trực ...
    Ngày nay với sự phát triển mạnh mẽ của Internet đã tạo ra sự bùng nổthông tin trên toàn thế giới! Thông tin ngày nay không ...

Ngày 12/04/2013

NoSQL MongoDB

Lượt xem: 5435

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
 
 
 

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!

■ Bình luận:

Tin liên quan

Hỗ trợ trực tuyến


ken.0110 Kỹ thuật

Mr Thiện: 0989 916 495

 


ken.0110 Tư vấn thiết kế

Mr.Ken:  0902 835 110