1、數據模型
主流的數據模型包括:關係模型、文檔模型、圖狀數據模型
一、關係模型
數據被組織成關係,在SQL中成爲表(table),其中每一個關係都是元組(turples)的無序集合(在SQL中成爲行)
二、文檔模型
也就是NoSQL,採用它有這樣幾個驅動因素,包括:
- 適用於一對多的數據模型
-
比關係數據庫更好的擴展性需求,包括支持超大數據集或超高寫入吞吐量
-
廣泛偏心免費和開源軟件而不是商業數據庫產品
-
關係模型不能很好地支持一些特定的查詢操做
-
對關係模式一些限制性感到沮喪,渴望更具動態和表達力的數據模型
-
MySQL執行Alter Table時會把如今的整張表複製,於是當表很大時可能會須要幾分鐘甚至幾小時的停機時間,儘管如今有各類輔助工具能夠解決這個限制
文檔模型的劣勢:
文檔數據庫有時被稱爲無模式,但這具備誤導性,由於讀數據的代碼一般採用某種結構於是存在某種隱形模式,而不是數據庫強制執行。更準確的術語應該是讀時模式(數據的結構是隱式的,只有在讀時才解釋),與寫時模式相對應。讀時模式相似編程語言中的動態(運行時)類型檢查,而寫時模式相似於靜態(編譯時)類型檢查。
三、圖狀數據模型
2、數據查詢語言
一、查詢語言分類
select * from animals where famiy='Sharks'
function getSharks(){
var sharks = [];
for(var i=0; i<animals.length; i++){
if(animals[i].family === "Sharks"){
sharks.push(animals[i]);
}
}
return sharks;
}
聲明式查詢語言比命令式API更加簡潔和容易使用。更重要的是,它對外隱藏了數據庫引擎的不少實現細節,這樣數據庫系統可以在不改變查詢語句的狀況下提升性能。
二、MapReduce查詢
db.observations.mapReduce(
function map(){
var year = this.observationTimestamp.getFullYear();
var month = this.observationTimesstamp.getMonth()+1;
emit(year + "-" +month, this.numAnimals);
},
function reduce(key, values){
return Arrays.sum(values);
},
{
query:{family : "Sharks"},
out: "monthlySharkReport"
}
);
三、Cypher查詢語言
最先爲Neo4j圖形數據庫而建立(它以電影「黑客帝國」中的一個角色命名,與密碼學中的密碼無關)
若是相同的查詢能夠用一種查詢語言寫4行代碼完成,而另外一種查詢語言則須要29行代碼,這足以說明不一樣的數據模型適用於不一樣的場景。所以,選擇適合應用程序的數據模型很是重要