第八章:JSON 與NoSQL
文章推薦指數: 80 %
CouchDB 是一種NoSQL 資料庫,以非關聯式方式儲存JSON 文件資料。
CouchDB 網站位置:http://couchdb.apache.org/ ... 範例【表示帳戶的JSON物件】.
第八章JSON與NoSQL
一般Web應用程式通常都是使用關聯性資料庫做為資料儲存體,就可以很容易的透過SQL語法做新增、修改、刪除與查詢對資料進行操作,
甚至可以結合兩個表格的查詢。
SELECTAccount.firstName,Account.lastName,Address.street,Address.zipFromAccountJOINAddress
ONAccount.accoundId=Address.accountId;
透過SQLJOIN語句,就可以取得Account與Address這兩個資料表的關聯資料:firstName,lastName,street與zip。
NoSQL不是關聯式資料庫,無法使用SQL語句查詢資料已取得關聯表格。
NoSQL是一個【鍵-值儲存體】有些是XML文件或JSON文件,
我們討論一種使用JSON文件來儲存資料的文件儲存體資料庫CouchDB。
8-1CouchDB資料庫
CouchDB是一種NoSQL資料庫,以非關聯式方式儲存JSON文件資料。
CouchDB網站位置:http://couchdb.apache.org/
以【NoSQL】冠名的資料庫,就是告訴我們他不是關聯式資料庫,我們不能使用SQL語句來查詢資料。
當我們要查詢帳戶與地址這總關聯式資料庫時,使用CouchDB時,資料的關係不會要求使用資料表分開的方式儲存
並於讀取時組合,關係是由資料表達。
範例【表示帳戶的JSON物件】
{
"firstName":"Bob",
"lastName":"Barker",
"age":91,
"address":[
{
"street":"123fakest",
"city":"Somewhere",
"state":"OR",
"zip":"97520"
},
{
"street":"456fakest",
"city":"SomePlace",
"state":"CA",
"zip":"9600"
}
]
}
當我們向CouchDB資料庫查詢帳戶資料時,會取得一份結構化的文件,無須重組關聯性,這種方式既方便又快。
但是當需要多層的關聯,這種文件模式很快就會遇到麻煩。
例如地址與城市要與不同的表作關聯,或者是城市
與郵遞區號產生關聯,單一結構文件就會很難表達複雜的關係。
CouchDB另一個擅長的事情就是處裡演進資料。
我覺得用【處裡演進資料】來敘述有點抽象,我把它稱為
【加欄位】這樣比較有感覺,每當客戶要改資料欄位時,就真的很想....幫他改XDD。
當我的資料表越複雜時,
也許就會再開一個資料表來協助儲存關聯資訊。
使用CouchDB時,當資料演進時可以不需要修改結構描述,可以在JSON中以物件陣列代表電話號碼,這樣每個帳號
可以有無限的相關電話號碼相關紀錄。
範例【物件代表電話號碼】
{
"phoneNumbers":[
{
"description":"homephone",
"number":"02-753-3967"
},
{
"description":"cellphone",
"number":"0935-999-999"
},
{
"description":"fax",
"number":"02-899-9888"
}
]
}
如果再度演進,第二支手機有新的號碼,我們可以將新手機號碼直接加入phoneNumbers物件中。
範例【物件中加入新的號碼】
{
"phoneNumbers":[
{
"description":"homephone",
"number":"02-753-3967"
},
{
"description":"cellphone",
"number":"0935-999-999"
},
{
"description":"fax",
"number":"02-899-9888"
},
{
"description":"cellphone2",
"number":"0988-888-888"
}
]
}
另外,若要在帳戶中加入新的欄位,我們可以直接加入新的紀錄中,無須修改資料結構描述。
範例【帳戶加入新的欄位galaxy】
{
"firstName":"Bob",
"lastName":"Barker",
"age":91,
"address":[
{
"street":"123fakest",
"city":"Somewhere",
"state":"OR",
"zip":"97520"
},
{
"street":"456fakest",
"city":"SomePlace",
"state":"CA",
"zip":"9600"
}
],
"galaxy":"MilkyWay"
}
8-2安裝CouchDB
使用Ubuntu安裝方式很簡單,照著官網提供的方式順序安裝即可完成。
安裝ppa-finding工具for12.04release
sudoapt-getinstallpython-software-properties-y
sudoapt-getinstallsoftware-properties-common-y
添加PPA。
PPA說明參考網址:PPA
sudoadd-apt-repositoryppa:couchdb/stable-y
更新套件
sudoapt-getupdate-y
移除全部的二進位安裝方式的Couchdb檔案
sudoapt-getremovecouchdbcouchdb-bincouchdb-common-yf
開始安裝Couchd,加入-V參數,可以觀看安裝訊息
sudoapt-getinstall-Vcouchdb
Readingpackagelists...
DoneBuildingdependencytree
Readingstateinformation...
Done
Thefollowingextrapackageswillbeinstalled:
couchdb-bin(x.y.z0-0ubuntu2)
couchdb-common(x.y.z-0ubuntu2)
couchdb(x.y.z-0ubuntu2)
停止Couchdb
sudostopcouchdb
couchdbstop/waiting
若有需求可修改/etc/couchdb/local.ini設定檔的'bind_address=0.0.0.0'修改連線IP。
*
啟動CouchDB指令
sudostartcouchdb
couchdbstart/running,process3541
馬上透過網址連線CouchDB,http://127.0.0.1:5984/若已正常啟動,就以透過網址方式看到網頁顯示的內容,代表您的CouchDB已安裝成功。
{
"couchdb":"Welcome",
"uuid":"ca53fa82a896fde3fe1f35d53162bedb",
"version":"1.6.1",
"vendor":{
"name":"Ubuntu",
"version":"14.04"
}
}
相關連結
Ubuntu安裝方式
其他安裝方式
8-3CouchDBAPI
使用CouchDB時,向資料庫查詢資料方式是透過Http請求資源。
底下示範如何新增資料庫與資料。
查詢目前我們的資料庫有哪些預設的資料庫。
http://127.0.0.1:5984/_all_dbs
[
"_replicator",
"_users"
]
顯示目前我們只有兩個預設的資料庫,_replicator和_users。
查詢_users資料庫資訊。
http://127.0.0.1:5984/_users
{
"db_name":"_users",
"doc_count":1,
"doc_del_count":0,
"update_seq":1,
"purge_seq":0,
"compact_running":false,
"disk_size":4194,
"data_size":2141,
"instance_start_time":"1454122440071841",
"disk_format_version":6,
"committed_update_seq":1
}
注意doc_count這個名稱-值對,他代表資料庫文件數,目前是1。
查詢*_users*資料庫中所有文件識別陣列。
http://127.0.0.1:5984/_users/_all_docs
{
"total_rows":1,
"offset":0,
"rows":[
{
"id":"_design/_auth",
"key":"_design/_auth",
"value":{
"rev":"1-75efcce1f083316d622d389f3f9813f7"
}
}
]
}
目前只有顯示有一個文件識別陣列。
透過查詢*_users*資料庫中所有文件識別陣列請求文件。
http://127.0.0.1:5984/_users/_design/_aut
{
"_id":"_design/_auth",
"_rev":"1-75efcce1f083316d622d389f3f9813f7",
"language":"javascript",
"validate_doc_update":"*etc...*"
}
建立一個新資料庫,修改Http為PUT動詞,建立一個account資料表。
PUThttp://127.0.0.1:5984/accounts
{"ok":true}
代表建立成功。
透過前面的查詢資料庫API,得知目前我們有3個資料表。
[
"_replicator",
"_users",
"accounts"
]
建立一個新資料,修改Http為POST動詞。
請確認Content-type:application/json
POSThttp://127.0.0.1:5984/accounts
傳送文件內容如下。
{
"name":"Shon",
"age":20,
"address":{
"street":"450FakeyFakest",
"city":"somewhere",
"state":"CA",
"zip":"123"
},
"gender":"male"
}
回應如下,就代表建立成功。
{
"ok":true,
"id":"0e2271540bd5a17dd4fd4fc3e800125c",
"rev":"1-06eb6f58155be163f2588a34d3ff5832"
}
透過前述的查詢即可得知該筆資料的內容。
最後也可以透過網頁操作的方式完成上述的工作,在網址後面加入_utils。
http://127.0.0.1:5984/_utils/
相關連結
CouchDBAPI
第七章:JSON與用戶端架構
Next:第九章:伺服器端的JSON
延伸文章資訊
- 1NoSQL 非關聯式資料庫- Key-Value Database - 吳統雄
... 路興起帶動了巨量資料(Big Data)現象,內在的資訊技術能力挑戰:尤其是資料可擴展性(scalability)問題。 NoSQL/Key-Value 非關聯式資料庫的範例、技術、與未來。
- 2Day 1 - MongoDB 基礎概念教學
近幾年 非關聯式資料庫(NoSQL) 成為大家時常討論的技術主題, ... 上BSON 支援的type 有很多,這邊我們再舉一個包含多種type 的document 當作範例:
- 3SQL vs NoSQL: The Differences - 資訊人筆記
在這篇文章中我們會涵蓋SQL/NoSQL 根本上的差異,在我們的範例中會以主流的MySQL SQL and MongoDB NoSQL database 為例,其他SQL/NoSQL 則是大同小...
- 4NoSQL與MongoDB - CH.Tseng
最早NoSQL的確是指No SQL這個意思,可回溯至90年代某個開放原始碼的關聯式資料 ... Key-values Stores範例: ... Column Family Stores範例:.
- 5閃開!讓專業的來:SQL 與NoSQL - iT 邦幫忙
如果你想撈出文章id 是123 的所有評論,你只要 select * from comments where post_id=123 這樣就好了。當然這個是屬於比較簡單的範例,還有更複雜的場景以...