ĐẠ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.
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
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ỉ
http://wowquatot.com/index.php/category/view/id/533ba29963ff878c09000
004) và máy chủ web xử lý yêu cầu đó bằng cách thực hiện script.
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
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),
);
- 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ỉ http://wowquatot.com/index.php/category/view/, 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())
<?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: http://www.yiiframework.com/extensions/
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
),
),
Đâ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
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ề
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ó
độ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.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
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