ĐẠI HỌC ĐÔNG Á
KHOA CÔNG NGHỆ THÔNG TIN
ĐỒ ÁN
TỐT NGHIỆP ĐẠI HỌC
ĐỀ TÀI:
“NGHIÊN CỨU CÁC GIẢI PHÁP CÔNG NGHỆ:
NOSQL, YII FRAMEWORK ĐỂ TỐI ƯU TỐC ĐỘ
TRUY VẤN THÔNG TIN VÀ DỮ LIỆU CHO
WEBSITE WOWQUATOT.COM”
Giảng viên hướng dẫn : Ths. HỒ ĐỨC LĨNH
Sinh viên thực hiện : BÙI XUÂN BÍCH
Lớp : 12DHLTTH1A
Khoá : 2012-2014
Hệ : Chính quy
Đà Nẵng, tháng 4 /2014
ĐẠI HỌC ĐÔNG Á CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập - Tự do – Hạnh phúc
KHOA CÔNG NGHỆ THÔNG TIN
ĐỀ TÀI ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC
Họ và tên sinh viên: Bùi Xuân Bích
Lớpp: 12DHLTTH1A Khoá: 2012-2014
Ngành đào tạo: Công nghệ thông tin Hệ đào tạo: Chính quy
1/ Tên đồ án tốt nghiệp:
Nghiên cứu các giải pháp công nghệ: NoSQL, Yii framework để tối ưu tốc độ truy vấn
thông tin và dữ liệu cho website wowquatot.com.
2/ Nội dung chính của đồ án:
- Mở đầu.
- Giới thiệu về Yii framework.
- Tổng quan về NoSQL.
- Giới thiệu về mongodb.
- So sánh hiệu năng MongoDB với MySQL.
- Kết luận và hướng phát triển.
3/ Cơ sở dữ liệu ban đầu
- Dữ liệu của website đang hoạt động: wowquatot.com.
4/ Ngày giao đồ án: /12/2013
5/ Ngày nộp đồ án : /4/2014
TRƯỞNG BỘ MÔN (Duyệt) GIÁO VIÊN HƯỚNG DẪN
(Ký, ghi rõ họ tên) (Ký, ghi rõ họ tên)
TRƯỞNG KHOA
LỜI CAM ĐOAN
Tôi xin cam đoan đây là đề tài nghiên cứu của tôi. Những thông tin và các số liệu
trong báo cáo thực tập tốt nghiệp được khai thác tại nguồn dữ liệu của website
wowquatot.com. Trong quá trình làm đồ án tốt nghiệp, ngoài những tài liệu tìm kiếm
trên mạng và trong sách vở. Tôi xin cam đoan không sao chép, không nhờ người khác
làm. Nếu không đúng sự thật tôi xin chịu hoàn toàn trách nhiệm và chịu mọi hình thức
kỉ luật của thầy, cô và của khoa CNTT Trường Đại Học Đông Á.
Sinh viên thực hiện
Bùi Xuân Bích
MỞ ĐẦU
1. Lý do chọn đề tài
Hiện nay có rất nhiều ngôn ngữ lập trình web như: ASP, ASP.NET, C#, VB, PHP,
JAVA và phổ biến nhất hiện nay là ASP.NET và PHP. Trong đó thì PHP được sử
dụng rộng rãi vì đây là mã nguồn mở rất dễ sử dụng. Ngôn ngữ PHP có thêm những
framework hỗ trợ người lập trình rất nhiều trong quá trình viết code. Đứng đầu trong
nhóm framework đó thì Yii là giải pháp tốt nhất cho tôi áp dụng vào website
wowquatot.com vì các đặc tính nổi trội của nó.
Đặc biệt là sự bùng nổ công nghệ Web 2.0, nơi các mạng dịch vụ dữ liệu cộng
đồng cho phép người dùng tự do tạo nội dung trên web, dẫn đến dữ liệu tăng lên rất
nhanh, vượt qua giới hạn xử lý của các Hệ quản trị cơ sở dữ liệu quan hệ truyền thống.
Để đáp ứng được nhu cầu phát triển của xã hội, đòi hỏi một cơ sở dữ liệu (CSDL)
có thể lưu trữ, xử lý được một lượng dữ liệu lớn một cách nhanh chóng và hiệu quả.
NoSQL đã ra đời, thay thế hệ quản trị CSDL quan hệ, giải quyết bài toán trên.
2. Mục đích và nhiệm vụ nghiên cứu
Vận dụng tổng hợp những kiến thức về Yii framework đó là những kiến thức về
mặt lý thuyết để áp dụng vào ứng dụng.
Tìm hiểu khái quát về các CSDL hiện đại NoSQL, chi tiết hơn về hệ cơ sở dữ liệu
NoSQL là MongoDB và đồng thời giúp tôi có thể thực hiện tối ưu tốc độ truy vấn dữ
liệu cho website wowquatot.com trên hệ cơ sở dữ liệu MongoDB
LỜI CẢM ƠN
Để hoàn thành đồ án tốt nghiệp, tôi xin gửi lời cảm ơn sâu sắc tới các thầy cô giáo
trong Khoa công nghệ thông tin Trường Đại học Đông Á đã trực tiếp giảng dạy và
cung cấp cho tôi những kiến thức quý báu để tôi có thể tìm hiểu và tiếp cận với những
công nghệ và lĩnh vực mới.
Đặc biệt tôi xin chân thành gửi lời cảm ơn đến thầy Hồ Đức Lĩnh – Giảng viên
Trường Đại Học Đông Á đã tận tình hướng dẫn tôi cũng như tạo mọi điều kiện về tài
liệu và kiến thức để tôi có thể hoàn thành được đồ án tốt nghiệp này.
Và cuối cùng xin gửi lời cảm ơn tới gia đình, tới các bạn đã động viên, góp ý và sát
cánh cùng tôi trên con đường học tập.
Báo cáo hoàn thành trong thời gian ngắn và khả năng của tôi còn hạn chế nên đồ án
tốt nghiệp không tránh khỏi những thiếu sót trong quá trình thực hiện. Kính mong
nhận được nhiều ý kiến đóng góp, phê bình của quý thầy cô và các bạn để sản phẩm
được hoàn thiện hơn.
Tôi xin chân thành cảm ơn!
Đà Nẵng, Ngày… tháng…năm 2014
MỤC LỤC
DANH MỤC HÌNH ẢNH
DANH MỤC BẢNG
Đồ án tốt nghiệp Đại học 6
CHƯƠNG 1: YII FRAMEWORK
1.1.Khái quát về Yii framework
Yii là từ viết tắt của Yes, it is! hoặc cũng có thể là viết ngắn gọn 3 chữ cái đầu của
Easy (dễ dàng), Efficient (hiệu quả) và Extensible (khả năng mở rộng). Yii là một PHP
framework mã nguồn mở và hoàn toàn miễn phí, có hiệu năng cao, giúp người lập
trình phát triển tốt nhất các ứng dụng Web 2.0. Yii cho phép tái sử dụng tối đa các
thành phần của ứng dụng để tăng tốc độ viết ứng dụng.
Hình 1.1. Hiệu suất Yii
1.1.1. Kiến trúc Yii framework
Yii được viết theo mô hình MVC, đây là mô hình thông dụng trong lập trình web.
Mô hình MVC tách biệt phần xử lý dữ liệu ra khỏi phần giao diện, cho phép kiểm tra,
quản lý và bảo trì một cách dễ dàng và độc lập:
View
Controller
Model
Hình 1.2: Mô hình MVC
Bên cạnh đó Yii còn phát triển thêm một bộ điều khiển phía trước gọi là
Application. Application thu thập một số yêu cầu của người dùng sau đó đưa đến cho
controller thích hợp để xử lý thêm.
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Hình 1.1. Mô hình MVC
Đồ án tốt nghiệp Đại học 7
widget
index.php
application
controller
app
componentss
model
view
Để hiểu rõ hơn về cách thức phối hợp của Yii ta có thể xem ví dụ dưới
7
model
view
layout
widget
8
9
10
Controller
filters
action
4
5
urlManager
index.php
application
Request
1
11
2
3
6
đây về các xử lý yêu cầu nhập vào từ người dùng.
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Hình 1.1. Cấu trúc tĩnh của Yii Application
Hình 1.1. Quy trình làm việc của một ứng dụng Yii
Đồ án tốt nghiệp Đại học 8
Quá trình phối hợp của Yii được mô tả theo các bước sau:
- Bước1: Người dùng tạo yêu cầu đối với url (ví dụ: với thanh địa chỉ
/>004) và máy chủ web xử lý yêu cầu đó bằng cách thực hiện script.
- Bước 2: Script tạo ra một Application và chạy nó.
- Bước 3: Application có được chi tiết yêu cầu của người dùng từ application
component có tên là request.
- Bước 4: Application này xác định yêu cầu controller và action với sự giúp
đỡ của một application component có tên urlManager.
- Bước 5: Application tạo ra một bộ điều khiển để tiếp tục xử lý yêu cầu
người dùng, bộ điều khiển nhận thấy action (view) có liên quan đến phương
thức (actionView) trong controller. Sau đó nó sẽ tạo ra các bộ lọc để kết
hợp với action này.Các action sẽ được thực hiện dưới sự cho phép của các
bộ lọc.
- Bước 6: Action sẽ đọc Catagory model với ID=533ba29963ff878c09000004
với dữ liệu từ database.
- Bước 7: Action sẽ render một view có tên là view với Category model.
- Bước 8: View sẽ đọc là trình bài các thuộc tính của Category model.
- Bước 9: View sẽ thực hiện một số widgets.
- Bước 10: Kết quả của view sẽ được nhúng vào layout.
- Bước 11: Action hoàn thành các kết quà của view và hiện kết quả nguời
dùng.
1.1.2. Cấu trúc thư mục trong Yii framework
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 9
Hình 1.1. Cấu trúc Yii
Trong đó thư mục chính là 3 thư mục: models, controllers, views.
Bảng 1.1. Chức năng các thư mục và file trong cấu trúc Yii
TÊN FILE VÀ THƯ MỤC CHỨC NĂNG
index.php file script truy cập đến ứng dụng web
index-test.php file script truy cập đến các chức năng
kiểm định
assets chứa các file nguồn được công bố
css chứa các file định dạng css
images chứa các file ảnh
protected chứa các file bảo vệ của ứng dụng
commands chứa các lệnh yiic được thiết lập
components chứa các components có thể sử dụng lại
config chứa các file cấu hình
controller chứa các tập tin lớp điều khiển
data chứa các cơ sở dữ liệu mẫu
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 10
extensions chứa các phần mở rộng của Yii
messages chứa các thông điệp đã được dịch
model chứa các tập tin lớp của mô hình
runtime chứa các tập tin tạm thời tạo ra
test chứa các file script kiểm tra
view chứa các file điều khiển xem và bố trí của
ứng dụng
yiic yiic command line script cho Unix/Linux
yiic.bat yiic command line script cho Windows
yiic.php yiic command line script cho Windows
themes chứa các mẫu của ứng dụng
Bảng 1.1. Bảng các thành phần ứng dụng trong Yii
TÊN CÁC THÀNH PHẦN ỨNG
DỤNG
CHỨC NĂNG
assetManager: CAssetManager quản lý việc xuất bản các tập tin riêng.
authManager: CAuthManager quản lý kiểm soát truy cập
cache: CCache cung cấp dữ liệu bộ nhớ đệm
clientScript: CClientScript quản lý lệnh của người dùng (JavaScript và
CSS).
coreMessages: CPhpMessageSource cung cấp thông điệp cốt lõi dịch được sử dụng
bởi các khuôn khổ Yii.
db: CDbConnection Cung cấp các kết nối cơ sở dữ liệu.Lưu ý, phải
cấu hình connection String để sử dụng thành
phần này.
errorHandler: CErrorHandler xử lý lỗi
format: CFormatter định dạng dữ liệu giá trị cho mục đích hiển thị
messages: CPhpMessageSource cung cấp thông dịch được sử dụng bởi ứng
dụng Yii
request: CHttpRequest cung cấp thông tin liên quan đến yêu cầu
người dùng
securityManager: CSecurityManager cung cấp vấn đề liên quan đến dịch vụ
session: CHttpSession cung cấp phiên liên quan đến chức năng
statePersister: CStatePersister cung cấp cơ chế cho trạng thái toàn cục
urlManager: CUrlManager cung cấp các phân tích cú pháp URL và chức
năng sáng tạo
user: CWebUser mang thông tin liên quan đến danh tính người
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 11
dùng hiện hành
themeManager: CThemeManager quản lý chủ đề
1.2. Model – Trao đổi thông tin
Model là lớp được xây dựng nhằm trao đổi thông tin với cơ sở dữ liệu. Một lớp
model có thể thực hiện việc kết nối, thêm, xoá, sửa dữ liệu. Theo lời khuyên của các
lập trình viên ta nên tuân theo một số nguyên tắc sau:
Không nên sử dụng $_GET, $_POST hoặc các biến tương tự được gắn liền với
yêu cầu người dùng.
Tránh nhúng đoạn mã HTML vào model.
Tên lớp được viết hoa chữ cái đầu tiên, các chữ còn lại viết thường, ví dụ như:
Place,Ticket…
Tên tập tin được đặt tên trùng với tên lớp và được đặt vào thư mục
protected/models.
Bắt buộc thừa kế từ lớp model, trong hàm tạo lớp con phải gọi đến hàm lớp cha.
1.2.1. Tạo model
Để xây dựng một lớp model, phải quyết định loại dữ liệu từ người dùng yêu cầu
và những luật lệ mà những dữ liệu này phải tuân theo. Một model, như định nghĩa, là
nơi trung tâm để xác nhận yêu cầu.
Tùy thuộc vào cách ta sử dụng các đầu vào của người sử dụng, ta có thể tạo ra
hai loại mô hình. Nếu yêu cầu của người dùng nhập vào được sử dụng và sau đó bỏ đi,
ta sẽ tạo ra một form_model, nếu yêu cầu của người dùng nhập vào được lưu vào cơ sở
dữ liệu, ta sẽ sử dụng một active record thay thế.
1.2.2. Định nghĩa lớp model
Dưới đây là lớp Category dùng để xử lý phần danh mục địa điểm:
class Category extends EMongoDocument {
public static function model($className = __CLASS__) {
return parent::model ( $className );
}
Hình 1.1. Cấu trúc lớp Category trong model
Khi đã định nghĩa xong lớp model ta sẽ đặt luật cho model
1.2.3. Đặt luật cho model
Để đặt luật cho model ta dùng hàm
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 12
// Đặt luật cho model
public function rules() {
return array(
array('name', 'required'),
array('description', 'length', "max" => 500),
array('status, position', 'numerical', 'integerOnly' =>
true),
);
}
Hình 1.1. Luật (Rules) trong model
Một khi người dùng gửi các yêu cầu của mình ta cần đảm bảo chúng phải hợp lệ
trước khi sử dụng. Ta xác định luật trong phương thức rules(), tuỳ thuộc vào yêu cầu
mà ta xác lập trong hàm rules() sẽ trả về điều kiện theo ta đặt ra.
1.2.4. Kết nối với bảng trong cơ sở dữ liệu
Lớp model có chức năng kết nối với các bảng trong cơ sở dữ liệu MySQL hay
collection trong MongoDB, để thể hiện mối liên kết đó ta dùng:
public function getCollectionName() {
return "categories";
}
Hình 1.1. Funtion kết nối tới collection trong MongoDB
1.3.Controller –Bộ điều khiển
Controller là những lớp đóng vai trò trung gian giữa view và model. Controller
nhận các yêu cầu từ phía người dùng, kiểm tra chúng trước khi chuyển qua cho model.
Sau khi model xử lý yêu cầu và trả về cho controller, controller sẽ chuyển sang view
để hiện thị dữ liệu cho người dùng.
1.3.1. Một lớp controller trong Yii có dạng
class CategoryController extends Controller
{
/* Các hàm xu ly */
}
Hình 1.3. Cấu trúc 1 lớp trong controller của Yii
Khai báo hàm cotroller ta cần tuân theo một số nguyên tắc:
- Tên lớp được viết hoa chữ cái đầu tiên, các chữ còn lại viết thường, ví dụ
như: CategoryController.
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 13
- Tên tập tin được đặt tên trùng với tên lớp và được đặt vào thư mục
protected/controller.
- Bắt buộc thừa kế từ lớp controller. Trong hàm tạo lớp con phải gọi đến hàm
lớp cha.
- Controller thể hiện của lớp CController hoặc của một lớp mở rộng từ
CController. Khi một controller chạy nó thực hiện các hành động được yêu
cầu thường là mang từ model và sau đó render đến view. Một hành động,
thực chất là một lớp điều khiển có tên bắt đầu bằng action.
1.3.2. Các thành phần chính của controller
Route: Là thành phần quan trọng trong controller, nó giúp controller định tuyến
một địa chỉ khi người dùng gửi yêu cầu đến hệ thống. Ví dụ khi người dùng nhập điạ
chỉ thì địa chỉ này sẽ được bộ điều
hướng của Yii xử lý và gọi đến action được yêu cầu trong controller.
Trong đó:
- category: là tên controller
- view: là tên action trong controller
Action: Phương thức làm việc trong controller là làm nhiệm vụ tiếp nhận và xử
lý yêu cầu. Sau khi nhận kết quả từ model trả về, controller sẽ gọi đến view để hiện thị
kết quả cho người dùng.
Một action thường được định nghĩa như một phương pháp có tên bắt
đầu bằng action. Thông thường trong controller ta sẽ khai báo thêm các
hàm action để thực hiện các yêu cầu người dùng. Ví dụ actionCreate thực
hiện nhiệm vụ tạo mới một danh mục địa điểm.
class CategoryController extends Controller
{
public function actionCreate()
{
$model=new Category;
if(isset($_POST['Category']))
{
$model->attributes=$_POST['Category'];
if($model->save())
$this->redirect(array('category/view','id'=>$model->_id));
}
$this->render('create',array(
'model'=>$model,
));
}
Hình 1.3. actionCreate thực hiện nhiệm vụ tạo mới một danh mục địa điểm
Đây là hành động sẽ điều khiển đến trang create.php
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 14
1.4. View – Hiện dữ liệu
View được xây dựng nhằm thể hiện dữ liệu trong model thành các giao diện
tương tác với người dùng. View có thể là một trang web hoàn chỉnh hoặc chỉ là một
phần của trang web (header, footer, ). Nội dung của view ngoài mã HTML còn có mã
PHP. View không bao giờ được gọi trực tiếp mà phải thông qua controller.
1.4.1. Layout
Nó là một view đặc biệt được dùng để trang trí cho view. Layout thường chứa
một phần của giao diện người dùng được phổ biến một vài lần.Ví dụ một layout có thể
chứa phần header và footer, nhúng thêm phần nội dung hiển thị của view:
………header here………
<?php echo $content ?>
………footer here………
Hình 1.3. Cấu trúc layout trong Yii
Layout được sử dụng khi ta gọi hàm render(), theo mặc định file main.php trong
thư mục protected/views/layouts được sử dụng làm layout trong view. Ta có thể tuỳ
chỉnh bằng cách thay đổi CWebApplication::layout, CController::layout. Nếu view
mà không cần một layout nào ta dùng hàm renderPartial ().
1.4.2. Widget
Widget có thể được định nghĩa là một lớp con, có thể sử dụng lại nhằm tạo điều
kiện tốt hơn trong mã giao diện người dùng.
<?php $form=$this->beginWidget('CActiveForm'); ?>
Hình 1.3. Khai báo sử dụng Widget trong Yii
1.5. Các mở rộng (Extensions)
Đây là phần mở rộng trong Yii với nhiều phần rất hữu ích, được cung cấp tại
website chính của Yii framework: />GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 15
Hình 1.3. Extensions của Yii
Để làm việc với MongoDB trong đồ án này tôi đã sử dụng Extensions Yii
MongoDB Suite để thao tác dữ liệu với MongoDB một cách dễ dàng nhất. Phần mở
rộng này gần như hỗ trợ hoàn toàn cho ActiveRecord trong Yii nó được viết bởi
tyohan.
Để sử dụng Extensions này trong file protected/config/main.php chúng ta sẽ
thêm đoạn code sau:
'import' => array(
'ext.YiiMongoDbSuite.*',
),
'components' => array(
'mongodb' => array(
'class' => 'EMongoDB',
'connectionString' => 'localhost',
'dbName' => 'wowquatot',
'fsyncFlag' => true,
'safeFlag' => true,
'useCursor' => false
),
),
Hình 1.3. Cấu hình sử dụng Extension MongoDB Suite
1.6. Tạo khung ứng dụng
Công cụ yiic giúp tôi tạo ra ứng dụng một cách nhanh chóng.
D:\xampp\htdocs\yii\framework>yiic webapp D:\xampp\htdocs\wowquatot
Hình 1.3. Cú pháp lệnh tạo mới một ứng dụng Yii
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 16
Ví dụ ta tạo một ứng dụng tên là wowquatot được lưu trong thư mục
D:\xampp\htdocs. Sau đây là kết quả của câu lệnh trên, ta sẽ được một ứng dụng như
sau:
Hình 1.3. Ứng dụng wowquatot
Kết quả của việc tạo bộ khung ứng dụng ta có:
Thư mục controller: SiteController.php
Thư mục models: ContactForm.php, LoginForm.php
Thư mục views:
- Thư mục layout: column1.php, column2.php, main.php
- Thư mục site:
Thư mục pages:about.php
contact.php
error.php
index.php
login.php
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 17
CHƯƠNG 2: TỔNG QUAN VỀ NOSQL
2.1. NoSQL là gì ?
2.1.1. Thuật ngữ
NoSQL có nghĩa là Non-Relational (NoRel) - không ràng buộc. Tuy nhiên,
thuật ngữ đó ít phổ dụng hơn và ngày nay người ta thường dịch NoSQL thành Not
Only SQL - không chỉ là SQL.
Đây là thuật ngữ chung cho các hệ CSDL không sử dụng mô hình dữ liệu quan
hệ. NoSQL đặc biệt nhấn mạnh đến mô hình lưu trữ cặp giá trị - khóa và hệ thống lưu
trữ phân tán.
2.1.2. Lịch sử
Thuật ngữ NoSQL được giới thiệu lần đầu vào năm 1998 sử dụng làm tên gọi
chung cho các lightweight open source relational database (cơ sở dữ liệu quan hệ
nguồn mở nhỏ) nhưng không sử dụng SQL cho truy vấn.
Vào năm 2009, Eric Evans, nhân viên của Rackspace giới thiệu lại thuật ngữ
NoSQL khi Johan Oskarsson của Last.fm muốn tổ chức một hội thảo về cơ sở dữ liệu
nguồn mở phân tán. Thuật ngữ NoSQL đánh dấu bước phát triển của thế hệ CSDL
mới: phân tán (distributed) + không ràng buộc (non-relational).
NoSQL storage đặc biệt phổ dụng trong thời kỳ Web 2.0 bùng nổ, nơi các mạng
dịch vụ dữ liệu cộng đồng cho phép người dùng tạo hàng tỷ nội dung trên web. Do đó,
dữ liệu lớn rất nhanh vượt qua giới hạn phần cứng cần phải giải quyết bằng bài toán
phân tán.
2.2. So sánh NoSql và RDBMs
Các RDBMs hiện tại đã bộc lộ những yếu kém như việc đánh chỉ mục một lượng
lớn dữ liệu, phân trang, hoặc phân phối luồng dữ liệu media (phim, ảnh, nhạc ). Cơ
sở dữ liệu quan hệ được thiết kế cho những mô hình dữ liệu nhỏ thường xuyên đọc
viết trong khi các Social Network Services lại có một lượng dữ liệu cực lớn và cập
nhật liên tục do số lượng người dùng quá nhiều ở một thời điểm. Thiết kế trên
Distributed NoSQL giảm thiểu tối đa các phép tính toán, I/O liên quan kết hợp với
batch processing đủ đảm bảo được yêu cầu xử lý dữ liệu của các mạng dịch vụ dữ liệu
cộng đồng này. Facebook, Amazon là những ví dụ điểm hình.
Về cơ bản, các thiết kế của NoSQL lựa chọn mô hình lưu trữ tập dữ liệu theo cặp
giá trị key value. Khái niệm node được sử dụng trong quản lý dữ liệu phân tán. Với
các hệ thống phân tán, việc lưu trữ có chấp nhận trùng lặp dữ liệu. Một request truy
vấn tới data có thể gửi tới nhiều máy cùng lúc, khi một máy nào nó bị chết cũng không
ảnh hưởng nhiều tới toàn bộ hệ thống. Để đảm bảo tính real time trong các hệ thống
xử lý lượng lớn, thông thường người ta sẽ tách biệt database ra làm 2 hoặc nhiều
database. Một database nhỏ đảm bảo vào ra liên tục, khi đạt tới ngưỡng thời gian
hoặc dung lượng, database nhỏ sẽ được gộp (merge) vào database lớn có thiết kế tối
ưu cho phép đọc (read operation). Mô hình đó cho phép tăng cường hiệu suất I/O -
một trong những nguyên nhân chính khiến performance trở nên kém.
Thế hệ CSDL mới - NoSQL - giảm thiểu tối đa các phép tính toán, tác vụ đọc - ghi
liên quan kết hợp với xử lý theo lô (batch processing) đảm bảo được yêu cầu xử lý dữ
liệu của các dịch vụ mạng xã hội. Hệ CSDL này có thể lưu trữ, xử lý từ lượng rất nhỏ
đến hàng petabytes dữ liệu với khả năng chịu tải, chịu lỗi cao nhưng chỉ đòi hỏi về tài
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 18
nguyên phần cứng thấp. Thiết kế đặc biệt tối ưu về hiệu suất, tác vụ đọc - ghi, ít đòi
hỏi về phần cứng mạnh và đồng nhất, dễ dàng thêm bớt các node không ảnh hưởng tới
toàn hệ thống .
Các mô hình dữ liệu đặc thù của NoSQL cũng cấp API tự nhiên hơn so với việc
dùng RDBM.
Những ràng buộc về giấy phép sử dụng cùng với một khoản phí không nhỏ cũng là
ưu thế. Chấp nhận NoSQL đồng nghĩa với việc bạn tham gia vào thế giới nguồn mở
nơi mà bạn có khả năng tùy biến mạnh mẽ các sản phẩm, thư viện theo đúng mục đích
của mình.
Bảng dưới đây đưa ra một số so sánh giữa RDBM và NoSQL.
Bảng 2.2. Một số so sánh giữa RDBM và NoSQL
Tính năng CSDL quan hệ NoSQL
Hiệu suất
Kém hơn
SQL
Relational giữa các table
Cực tốt
Bỏ qua SQL
Bỏ qua các ràng buộc dữ liệu
Khả năng mở
rộng
Hạn chế về lượng. Hỗ trợ một lượng rất lớn các node.
Hiệu suất đọc-
ghi
Kém do thiết kế để đảm bảo sự
vào/ra liên tục của dữ liệu
Tốt với mô hình xử lý lô và những tối
ưu về đọc-ghi dữ liệu.
Thay đổi số
node trong hệ
thống
Phải shutdown cả hệ thống.
Việc thay đổi số node phức tạp.
Không cần phải shutdown cả hệ thống.
Việc thay đổi số node đơn giản, không
ảnh hưởng đến hệ thống.
Phần cứng Đòi hỏi cao về phần cứng.
Đòi hỏi thấp hơn về giá trị và tính
đồng nhất của phần cứng
2.2.1. Một số đặc điểm.
High Scalability: Gần như không có một giới hạn cho dữ liệu và người dùng
trên hệ thống.
High Availability: Do chấp nhận sự trùng lặp trong lưu trữ nên nếu một node
(commodity machine) nào đó bị chết cũng không ảnh hưởng tới toàn bộ hệ thống.
Consistency: Chấp nhận tính nhất quán yếu, cập nhật mới không đảm bảo rằng
các truy xuất sau đó thấy ngay được sự thay đổi. Sau một khoảng thời gian lan truyền
thì tính nhất quán cuối cùng của dữ liệu mới được đảm bảo.
Durability: Dữ liệu có thể tồn tại trong bộ nhớ máy tính nhưng đồng thời cũng
được lưu trữ lại đĩa cứng.
Horizontal scalable (khả năng mở rộng chiều ngang): Khi dữ liệu lớn về
lượng, phương pháp tăng cường khả năng lưu trữ và xử lý là dùng nhiều máy tính
phân tán. Phân tán dữ liệu được hỗ trợ bởi phần mềm tức cơ sở dữ liệu. Trong khi giá
thành phần cứng ngày càng giảm, tốc độ xử lý, bộ nhớ ngày càng tăng thì horizontal
scalable là một lựa chọn đúng đắn. Hàng trăm máy tính nhỏ được chập lại tạo thành
một hệ thống tính toán mạnh hơn nhiều so với vi xử lý RISC truyền thống đơn lẻ. Mô
hình này tiếp tục được hỗ trợ bởi các công nghệ kết nối Myrinet và InfiniBand. Từ đó
chúng ta có thể quản lý, bảo trì từ xa, xây dựng batch procession (xử lý đồng loạt tập
lệnh) tốt hơn. Do những đòi hỏi về tốc độ xử lý I/O cao, lượng cực lớn dữ liệu, scale
horizontally sẽ thúc đẩy các công nghệ lưu trữ mới phát triển giống như object storage
devices (OSD).
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 19
Deployment Flexibility: việc bổ sung thêm/loại bỏ các node, hệ thống sẽ tự
động nhận biết để lưu trữ mà không cần phải can thiệp bằng tay. Hệ thống cũng không
đòi hỏi cấu hình phần cứng mạnh, đồng nhất.
Phi quan hệ (hay không ràng buộc): relational - ràng buộc - thuật ngữ sử
dụng đến các mối quan hệ giữa các bảng trong cơ sở dữ liệu quan hệ (RDBM) sử dụng
mô hình gồm 2 loại khóa: khóa chính và khóa phụ (primary key + foreign key) để ràng
buộc dữ liệu nhằm thể hiện tính nhất quán dữ liệu từ các bảng khác nhau. Non-
relational là khái niệm không sử dụng các ràng buộc dữ liệu cho nhất quán dữ liệu.
Lưu trữ phân tán: mô hình lưu trữ phân tán các tập tin hoặc dữ liệu ra nhiều
máy khác nhau trong mạng LAN hoặc Internet dưới sự kiểm soát của phần mềm.
Nhất quán cuối: tính nhất quán của dữ liệu không cần phải đảm bảo ngay tức
khắc sau mỗi phép ghi. Một hệ thống phân tán chấp nhận những ảnh hưởng theo
phương thức lan truyền và sau một khoảng thời gian (không phải ngay tức khắc), thay
đổi sẽ đi đến mọi điểm trong hệ thống để cuối cùng dữ liệu trên hệ thống sẽ trở lại
trạng thái nhất quán.
Triển khai đơn giản, dễ nâng cấp và mở rộng, mô hình dữ liệu và truy vấn linh
hoạt.
2.2.2. Phân loại NoSql
Tính đến thời điểm hiện tại có 150 loại cơ sở dữ liệu NoSql (http://nosql-
database.org), chia làm các loại:
Wide Column Store / Column Families: Hệ cơ sở dữ liệu cho phép truy xuất
ngẫu nhiên/tức thời với khả năng lưu trức một lượng lớn dữ liệu có cấu trúc. Dữ liệu
có thể tồn tại dạng bảng với hàng tỷ bản ghi và mỗi bản ghi có thể chứa hàng triệu cột.
Hệ thống triển khai từ vài trăm cho đến hàng nghìn thiết bị dẫn đến khả năng lưu trữ
hàng petabytes nhưng vẫn đảm bảo hiệu năng cao. Một số sản phẩm thông dụng:
Hadoop/Hbase – Apache, Bigtable - Google, Cassandra - Facebook, Hypertable -
Baidu, Accumulo, Amazon SimpleDB, Cloundata, Clouera …
Document Store: Thực chất là các cơ sở dữ liệu hướng tài liệu, một thiết kế
riêng biệt cho việc lưu trữ tài liệu. Các cài đặt có thể là giả lập tương tác trên các cở sở
dữ liệu quan hệ, cơ sở dữ liệu đối tượng hay key-value store. Một số sản phẩm tiêu
biểu: MongoDB, Elasticsearch, Couchbase Server, CouchDB, RethinkDB
Key Value / Tuple Store: Mô hình lưu trữ dữ liệu dưới dạng cặp giá trị key-
value trong đó việc truy suất, xóa, cập nhật giá trị thực thông qua key tương ứng.Với
sự hỗ trợ của các kĩ thuật Btree, B+Tree, Hash,… Dữ liệu có thể tồn tại trên RAM
hoặc ổ cứng, phân tán hoặc không phân tán. Hầu hết cá NoSql Database đều là key-
value store. Các sản phẩm thông dụng: DynamoDB, Azure Table Storage, Riak, Redis
…
Graph Databases: Là một dạng cơ sở dữ liệu được thiết kế riêng cho việc lưu trữ
thông tin đồ họa như cạnh, nút hay thuộc tính. Một số sản phẩm tiêu biểu như: Neo4j,
Infinite Graph, InfoGrid, HyperGraphDB, Dex, GraphBase …
Multimodel Databases: Datomic, OrentDB, ArangoDB, FatDB, AlchemyDB …
Object Databases: Versant, db4o, Objectivity, Starcounter, Perst, VelocityDB,
HSS Database, ZoDB …
Grid & Cloud Database Solutions: Gigaspaces, Infinispan, Queplix, Hazelcast …
XML Databases: EMC Document xDB, eXist, Sedna, BaseX, Qizx …
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 20
Tuy cùng mang những đặc điểm chung của NoSQL nhưng mỗi CSDL NoSQL cũng có
những đặc điểm riêng, và vì thế thường được dùng cho những dự án khác nhau. Ví dụ:
MongoDB và Redis là những lựa chọn tốt cho việc lưu trữ các dữ liệu thống kê
ít được đọc mà lại được ghi thường xuyên.
Hadoop, một CSDL dạng tự do, phân tán làm tốt công việc lưu trữ các dữ liệu
lớn như các con số thống kê thời tiết hoặc công việc phân tích nghiệp vụ.
Memcachedb, một CSDL nhất thời chóng tàn, tuyệt vời trong lưu trữ các phiên
làm việc web, các khóa, và các con số thống kê ngắn hạn.
Cassandra và Riak (các lưu trữ dư thừa, tự động tạo bó cluster) làm tốt trong
các môi trường với các ứng dụng có tính sẵn sàng cao, khi thời gian sống tối đa là
sống còn.
CHƯƠNG 3: MONGODB
3.1.Tổng quan về MongoDB
MongoDB là một cơ sở dữ liệu mã nguồn mở, và được đánh giá là một cơ sở dữ
liệu có hiệu năng cao, thiết kế lược đồ tự do hay không có lược đồ quan hệ, đặc biệt nó
là một “cơ sở dữ liệu hướng tài liệu” được viết hoàn toàn bằng ngôn ngữ lập trình
C/C++. MongoDB là một cơ sở dữ liệu không quan hệ, nó quản lý thành các tập tài
liệu BSON, các tập tài liệu này có thể lồng vào nhau thành một cấu trúc cây phân cấp
phức tạp, nhưng vẫn dễ dàng truy vấn, đánh chỉ mục. Điều này cho phép các ứng dụng
lưu trữ dữ liệu theo cách tự nhiên và nó cũng thích hợp với các kiểu dữ liệu và các cấu
trúc tự nhiên trong các ngôn ngữ lập trình. Mục đích chính là tạo ra một cơ sở dữ liệu
có các tính chất: dễ sử dụng, tốc độ truy vấn nhanh, hiệu năng cao, tính khả dụng cao
và đặc biệt là dễ dàng mở rộng. Hiện nay có rất nhiều ứng dụng nổi tiếng trên Internet
đang sử dụng MongoDB như: Foursquare, Sourceforge, Bit.ly, Virber hay mạng xã hội
Coding Github…
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 21
3.1.1. Lịch sử ra đời MongoDB
Phát triển MongoDB bắt đầu tại 10gen (a software company) trong năm 2007,
khi công ty xây dựng một Nền tảng như một dịch vụ tương tự như Google App
Engine . Trong năm 2009, MongoDB trở thành mã nguồn mở như là một sản phẩm
độc lập với giấy phép AGPL .
Trong tháng 3 năm 2011, từ phiên bản 1.4, MongoDB đã hoàn thiện và sẵn sàng
cho các ứng dụng.
Phiên bản ổn định mới nhất (tháng 3 năm 2012) là 2.0.3, phát hành vào tháng 2
năm 2012.
3.1.2. Các thành phần/ cấu trúc của HQTCSDL MongoDB
Trước khi đi vào tìm hiểu kỹ hơn về MongoDB, chúng ta làm quen với một số
khái niệm cơ bản của MongoDB:
Văn bản (Document) là đơn vị cơ bản của dữ liệu trong MongoDB, nó tương
đương với một dòng trong CSDL quan hệ. Các văn bản trong MongoDB là các đối
tượng BSON (dạng nhị phân của JSON và hỗ trợ thêm kiểu dữ liệu như Date và
binary). Các đối tượng JSON, và có cấu trúc như sau (gồm tập hợp các khóa với các
giá trị tương ứng):
{
field1: value1,
field2: value2,
field3: value3,
fieldN: valueN
}
Hình 3.1. Cấu trúc một Document
Hình 3.1. Một văn bản (Document) mẫu
Bộ sưu tập (Collection): Bộ sưu tập là một nhóm các văn bản. Nếu văn bản
tương đương với dòng trong CSDL quan hệ thì bộ sưu tập tương đương với Bảng
(table). Bộ sưu tập là một Schema-Free, nghĩa là các văn bản có hình dạng khác nhau
có thể cùng được lưu trữ trong 1 bộ sưu tập.
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 22
Hình 3.1. Một bộ sưu tập (Collection) mẫu
Các khái niệm về Data và cấu trúc tổ chức dữ liệu (so sánh với MySQL):
Hình 3.1. So sánh cấu trúc dữ liệu MongoDB với MySQL
3.2.Mô hình hóa dữ liệu
Cũng như các hệ quản trị cơ sở dữ liệu khác, MongoDB đưa ra các khái niệm về
mô hình dữ liệu của bản thân nó:
Mongo system: Hệ thống lưu trữ dữ liệu.
Database: Mỗi database lưu trữ một tập các collection.
Collection (bộ sưu tập): Mỗi collection lưu trữ một tập các document.
Document (văn bản): Mỗi document lưu trữ một tập các field.
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 23
Field: Là một cặp key – value.
Key: Là tên.
Value: Có thể bao gồm các kiểu dữ liệu cơ bản hoặc kiểu dữ liệu tập hợp.
Dữ liệu trong MongoDB được lưu trữ một cách linh hoạt, bộ sưu tập không quy
định cấu trúc của văn bản. Điều đó có nghĩa là các văn bản trong cùng một bộ sưu tập
không cần phải có cùng một lĩnh vực hoặc cùng cấu trúc. Các field trong các văn bản
của một bộ sưu tập có thể chứa các loại dữ liệu khác nhau. Khi xây dựng mô hình dữ
liệu cho MongoDB, phải xem xét các đặc tính vốn có và các yêu cầu của các đối tượng
lưu trữ và mối quan hệ giữa các đối tượng đó với nhau. Quyết định mô hình dữ liệu
liên quan đến việc xác định cách cấu trúc các văn bản để lưu trữ hiệu quả, sao cho mô
hình dữ liệu gần giống và phản ánh đối tượng ở cấp ứng dụng. Hãy xem xét ví dụ dưới
để có thể hình dung cụ thể hơn về mô hình dữ liệu và cách lưu trữ dữ liệu của
MongoDB. Trong ví dụ, một cửa hàng tạp hóa cần lưu trữ danh sách khách hàng và chi
tiết hóa đơn mua hàng.
Nếu theo cách thông thường, sử dụng SQL, ta sẽ thiết kế các bảng như sau:
Hình 3.2. Các bảng trong CSDL quan hệ
Đối với MongoDB, ta không cần thiết kế bảng (table), mà sẽ thiết kế các lớp (class),
bảng sẽ được tự động sinh ra trong MongoDB.
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 24
Hình 3.2. Các class trong MongoDB
3.2.1. Mô hình nhúng One-to-One mối quan hệ giữa các Documents
Mô hình nhúng One-to-One là mô hình mà 1 văn bản được nhúng trong một
văn bản khác. Trong CSDL bình thường, văn bản địa chỉ lưu một tham chiếu đến văn
bản cha như sau:
{
_id: "joe",
name: "Joe Bookreader"
}
{
patron_id: "joe",
street: "123 Fake Street",
city: "Faketon",
state: "MA",
zip: 12345
}
Hình 3.2. Mô hình nhúng One-to-One thông thường
Nếu dữ liệu địa chỉ thường xuyên được truy cập, lấy thông tin về tên người
sống ở địa chỉ đấy, ứng dụng sẽ phải thực hiện rất nhiều truy vấn để có thể lấy ra thông
tin cần thiết. Mô hình dữ liệu tối ưu sẽ là nhúng văn bản địa chỉ vào văn bản tương
ứng của người sống tại địa chỉ đấy. Khi đấy ứng dụng có thể lấy thông tin chỉ với một
truy vấn.
{
_id: "joe",
name: "Joe Bookreader",
address: {
street: "123 Fake Street",
city: "Faketon",
state: "MA",
zip: 12345
}
}
Hình 3.2. Mô hình nhúng One-to-One tối ưu
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A
Đồ án tốt nghiệp Đại học 25
3.2.2. Mô hình nhúng One-to-Many mối quan hệ giữa các Documents
Trong trường hợp một người có nhiều địa chỉ:
{
_id: "joe",
name: "Joe Bookreader"
}
{
patron_id: "joe",
street: "123 Fake Street",
city: "Faketon",
state: "MA",
zip: 12345
}
{
patron_id: "joe",
street: "1 Some Other Street",
city: "Boston",
state: "MA",
zip: 12345
}
Hình 3.2. Mô hình nhúng One-to-Many thông thường
Mô hình hóa dữ liệu theo kiểu nhúng One-to-Many sẽ giúp truy vấn dữ liệu
nhanh hơn.
{
_id: "joe",
name: "Joe Bookreader",
addresses: [
{
street: "123 Fake Street",
city: "Faketon",
state: "MA",
zip: 12345
},
{
street: "1 Some Other Street",
city: "Boston",
state: "MA",
zip: 12345
}
]
}
Hình 3.2. Mô hình nhúng One-to-Many tối ưu
3.2.3. Mô hình tham chiếu One-to-Many mối quan hệ giữa các Documents
Trong một số trường hợp, mô hình hóa dữ liệu theo kiểu tham chiếu có ưu điểm
hơn so với mô hình hóa dữ liệu theo kiểu nhúng. Hãy xem xét ví dụ sau đây về mối
quan hệ giữa “nhà xuất bản” và “sách”. Nếu nhúng văn bản “nhà xuất bản” trong văn
bản “sách”, sẽ dẫn đến sự lặp lại dữ liệu “nhà xuất bản”, các văn bản sau cho thấy điều
đấy:
GVHD: Ths. Hồ Đức Lĩnh SVTH: Bùi Xuân Bích Lớp: 12DHLTTH1A