MongoDB:面向文檔的數(shù)據(jù)庫吮旅,每一個json字符串就是一個文檔
關(guān)系型數(shù)據(jù)庫難實現(xiàn),有很多挑戰(zhàn)杭攻。
序列化方案:用文本字段存json字符串趟妥,但先變成二進制猫态,變成bson的形式,存入dumps披摄,取出時要loads調(diào)差問卷web前端設(shè)計網(wǎng)頁(傳統(tǒng)的方法)
{?
? ? ? ?num:5?
? ? ? ?problems:[??
? ? ? ? ? ?{type:"danxuan",time:"...",xuanxiang:"...."}, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ??{type:"danxuan",time:"...",xuanxiang:"...."}, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? {type:"danxuan",time:"...",xuanxiang:"...."}, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? {type:"danxuan",time:"...",xuanxiang:"...."}, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? {type:"danxuan",time:"...",xuanxiang:"...."},
? ? ? ]
? ?}
table wenjuan< id,author,time,content>
先把要存儲的數(shù)據(jù)轉(zhuǎn)化亲雪,即序列化變成一個對象,取得時候先解析數(shù)據(jù)才能使用而面對大數(shù)據(jù)疚膊,如何擴展數(shù)據(jù)庫:
? ? ?提升性能:scale-up(成本太高义辕,配置要求太嚴格) vs scale-out
集群情況下主鍵自增的問題:分布式數(shù)據(jù)庫只能加鎖,但是還是順序的存儲寓盗,根本上還是沒有改變灌砖。? ? ? ? ? ? ? ? ? ? ? ? ??
大數(shù)據(jù)情況下璧函,由集群來實現(xiàn),就沒有主鍵的問題基显,MongoDB為每一個記錄設(shè)置一個id? ? ? ? ? ? ? ? ? ? ? ? ? ?
沒有結(jié)構(gòu)是MongoDB的特點蘸吓,無需定義表結(jié)構(gòu),直接插入數(shù)據(jù)撩幽,即文檔(json字符串)?
MongoDB? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sql
一個文檔就是一條記錄 ? ? ? ? 一個集合(就是一堆東西放一起库继,沒有固定結(jié)構(gòu))就是一張表
數(shù)據(jù)庫 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??數(shù)據(jù)庫
server ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?server
優(yōu)勢:
? ? ? ?特點:沒有表結(jié)構(gòu),容易擴展窜醉,id非自增宪萄,objectid,出生時就考慮集群。
? ? ? ? python,javascript(做前端后臺用同一種語言)全棧開發(fā)榨惰,流行的拜英,用一個語言來整體開發(fā)MapReduce分布式,MongoDB可以實現(xiàn)读串。? ? ? ? ? ? ? ? ? ? ? ? mangodb運維很簡單聊记,雙機熱備自動解決方案,集群添加新的結(jié)點
劣勢:
? ? ? ? ?不支持join查詢恢暖,即不能進行連接查詢,不同集合不能進行連接狰右。不支持事務(wù)數(shù)據(jù)非實時寫入杰捂,數(shù)據(jù)可能會丟失。
? ? ? stu<id,name,stuno,...>
? ? ?course<id,name,cridet,...>
? ? ? stu_course<id,id_stu,id_course>
? ? stu{name:lilei,stuno:1101}
? ? stu{name:cdcd,stuno:1102}
? ? course{name:math..}
? ? stu_course{...} {...} {....}
在關(guān)系型數(shù)據(jù)庫可以連接棋蚌,但是mangodb不行
stu_course{
? ? stu_name:"xiaoming",
? ? stuno:'20151209032027',
courses:[
? ? coursename:'math',courseteacher:'xxx',...
? ? coursename:'english',courseteacher:'xxx',...
? ? coursename:'hanyu',courseteacher:'xxx',...
...
]
}//這個表浪費空間
course_stu{
? ? course_name:'english',
? ? course_credit;4
? ? students:[
? ? stu_name:"xiaoming",stuno:'20151209032027',
? ? stu_name:"yansiyu",stuno:'20151209032033',
? ? stu_name:"quxiaojuan",stuno:'20151209031017',
? ?]
}//這個表也有重復(fù)信息冗余
student{name:"..",stuno:".."}
? ? course{coursename:"..",course_id:"..."}
? ? course_stu{stuno:"..",}//這種方法開發(fā)實現(xiàn)會比較困難嫁佳。
使用MongoDB進行插入數(shù)據(jù)的時候,可以通過變量的輸入進行谷暮。直接插入變量蒿往,這種方式簡單易于書寫。直接在命令窗口輸入容易出錯湿弦。
通過mapreduce的方式存儲數(shù)據(jù)瓤漏。
? ? ? ?在進行MongoDB的學(xué)習(xí)中,對索引的引入也是很重要的颊埃,老師上課講了一個問題蔬充,當加上索引創(chuàng)建十萬條記錄和沒有索引創(chuàng)建十萬條記錄那個插入效率快,其實應(yīng)該想到?jīng)]有索引插入快班利,畢竟索引本身也占有物理空間饥漫,添加索引在插入的同時還需要記錄下位置,插入效率當然慢罗标。但是通過建立索引拉取數(shù)據(jù)的時候庸队,還是可以明顯地看到查詢的時間短了很多积蜻。