99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀小白學(xué)數(shù)據(jù):一篇文章看懂NoSQL數(shù)據(jù)庫
小白學(xué)數(shù)據(jù):一篇文章看懂NoSQL數(shù)據(jù)庫
2016-05-06
收藏

小白學(xué)數(shù)據(jù):一篇文章看懂NoSQL數(shù)據(jù)庫

如果你關(guān)注大數(shù)據(jù)科技動(dòng)向,可能聽說過一個(gè)叫NoSQL數(shù)據(jù)庫的名詞,這可能讓人有些云里霧里。其實(shí)我們處在一個(gè)激動(dòng)人心的技術(shù)更迭時(shí)代,以甲骨文為代表的SQL數(shù)據(jù)庫已經(jīng)稱霸了企業(yè)市場30年,而近年來的NoSQL則是強(qiáng)有力的更新?lián)Q代的競爭者。這篇文章就通過問答的方式來給小白解釋NoSQL數(shù)據(jù)庫系統(tǒng)是什么,無論你的技術(shù)背景如何都能看得懂。對于數(shù)據(jù)分析從業(yè)人員來說,了解數(shù)據(jù)庫的趨勢可以讓你的職業(yè)生涯如虎添翼;而對于工程師來說,了解新的基礎(chǔ)系統(tǒng)更是必不可少的行業(yè)知識(shí)。

幾個(gè)基本問題

小白問:數(shù)據(jù)庫是什么東西,可以吃嗎?

答:……不可以。數(shù)據(jù)庫呢,就是存儲(chǔ)數(shù)據(jù)的地方,就像冰箱是存儲(chǔ)食物的地方一樣。


小白問:誒?我的數(shù)據(jù)就存儲(chǔ)在自己電腦里面的excel表里里,還要數(shù)據(jù)庫干嘛?

答:自己的數(shù)據(jù)的確很方便,但是對于企業(yè)來說就不一樣了。一個(gè)公司里面可能有成千上萬的Excel表格,還在不同的電腦上,而他們的員工和客戶需要實(shí)時(shí)看到企業(yè)給他們提供的所有數(shù)據(jù),這種文件管理的方法就很麻煩,總不能每分鐘都把一個(gè)新的巨大無比的excel文件發(fā)給所有客戶呀!而且數(shù)據(jù)庫更有用的是進(jìn)行查詢,企業(yè)會(huì)給內(nèi)部或者客戶開發(fā)不同的應(yīng)用,而這些應(yīng)用需要數(shù)據(jù)的時(shí)候可以直接實(shí)用數(shù)據(jù)庫的查詢語句快速得到結(jié)果。


小白問:哦,那是說所有的人都直接在這個(gè)系統(tǒng)上查數(shù)據(jù)和改數(shù)據(jù)嗎?

答:是的,數(shù)據(jù)庫也會(huì)幫助你處理“并發(fā)”,也就是如果多個(gè)人同時(shí)在改數(shù)據(jù)的情況。比如你在支付寶給小灰轉(zhuǎn)賬,而小灰這個(gè)時(shí)候又偏偏剛好在給你轉(zhuǎn)賬,這時(shí)候數(shù)據(jù)庫系統(tǒng)就要保證你們兩個(gè)人最后余額都是正確的,并且在你們進(jìn)行交易的時(shí)候別人如果同時(shí)查詢你們倆人的余額都會(huì)得到精確的結(jié)果。在一個(gè)企業(yè)系統(tǒng)中,一秒鐘可能有成千上萬個(gè)這樣的查詢和改動(dòng)發(fā)生呢。


小白問:那SQL又是什么鬼?

答:SQL是一種可以查詢關(guān)系型數(shù)據(jù)庫的語言,關(guān)系型數(shù)據(jù)庫也叫SQL數(shù)據(jù)庫。

所謂關(guān)系型數(shù)據(jù)庫就是數(shù)據(jù)是以表格的形式進(jìn)行存儲(chǔ)的,就和你電腦上的Excel表一樣,數(shù)據(jù)是一行一列整整齊齊的躺著的。表格之間有著這樣或那樣的關(guān)系,可以通過某信息連接在一起 。想查這些表格里的任何數(shù)據(jù)的程序員們就可以把他們想要的數(shù)據(jù)形式轉(zhuǎn)化成SQL語句然后發(fā)給數(shù)據(jù)庫,得到數(shù)據(jù)結(jié)果。比如你可以有一個(gè)食物管理的數(shù)據(jù)庫,里面有兩個(gè)表(食物表和主人表),長成下面的這個(gè)樣子:


食物編號(hào)食物名稱數(shù)量 喜愛程度主人編號(hào)

1             獼猴桃      4      53

2    菠菜         10      2  2

3巧克力      99    1001


主人編號(hào)主人姓名      主人性別

1小白                 女

2小黑                 男

3小灰                 男


我們可以寫一句簡單的SQL語句直接調(diào)出所有男主人擁有的食品及數(shù)量。

SELECT 主人姓名,食物名稱,數(shù)量

FROM 食物表,主人表

WHERE  食物表.主人編號(hào)=主人表.主人編號(hào) AND 主人性別=‘男’

=>

主人姓名食物名稱數(shù)量

小黑菠菜10

小灰獼猴桃 4

深入聊聊

小白問:哦,那NoSQL到底有什么過人之處呢?

答:因?yàn)榻陙砥髽I(yè)要處理的數(shù)據(jù)越來越多,越來越復(fù)雜,就出現(xiàn)了兩個(gè)之前關(guān)系型數(shù)據(jù)庫解決不了的問題:快速增長的數(shù)據(jù)規(guī)模和日漸復(fù)雜的數(shù)據(jù)模型。

第一個(gè)問題就是數(shù)據(jù)越來越多,公司以前買的裝關(guān)系型數(shù)據(jù)庫的那臺(tái)電腦放不下了,那這個(gè)時(shí)候就有兩種選擇:

一種就是直接去買一臺(tái)更大空間的計(jì)算機(jī)取代現(xiàn)有的機(jī)器。這個(gè)方法是有限制的,因?yàn)檫@種機(jī)器的價(jià)格一般非常昂貴,而且這個(gè)空間總是有一個(gè)上限的。

另外一種選擇就是再買一臺(tái)機(jī)器,然后把新的數(shù)據(jù)放到新機(jī)器里的另外一個(gè)SQL數(shù)據(jù)庫里面,這個(gè)過程也叫“分片”(sharding)。 這個(gè)時(shí)候程序員要開始杯具的加班了。因?yàn)檫@個(gè)轉(zhuǎn)換的過程非常容易出問題,而且會(huì)給使用數(shù)據(jù)庫的應(yīng)用增加很多的復(fù)雜度。比如我們之前的例子,在查詢食品和數(shù)量的語句的時(shí)候我們要將同樣的語句同時(shí)發(fā)給兩個(gè)服務(wù)器,然后把最后的結(jié)果綜合起來,給應(yīng)用的開發(fā)增加了很多不必要的負(fù)擔(dān)。分片還有很多別的缺點(diǎn)我就不一一贅述了。

而NoSQL數(shù)據(jù)庫的服務(wù)器本身就支持很多個(gè)機(jī)器存儲(chǔ)數(shù)據(jù)進(jìn)行分布式查詢,這樣當(dāng)空間不夠用的時(shí)候就直接去扛一臺(tái)新的機(jī)器回來連接到已有的計(jì)算機(jī)集群上裝好數(shù)據(jù)庫即可,程序員可以回家睡個(gè)好覺啦。


小白問:明白了,那另外一個(gè)關(guān)系型數(shù)據(jù)庫沒有解決的問題呢?

答:另外的一個(gè)問題就是把數(shù)據(jù)放到SQL數(shù)據(jù)之前要進(jìn)行數(shù)據(jù)建模,也就是要考慮好每一個(gè)表里面每一列都代表什么,不同的表格之間要怎樣相互關(guān)聯(lián)起來。這對很多公司來說是一件非常耗費(fèi)時(shí)間和精力的事情,因?yàn)樗麄兊臄?shù)據(jù)源的種類太多了。而且在數(shù)據(jù)進(jìn)入數(shù)據(jù)庫之后,如果在表中增加新的一列(比如想把食物的種類加進(jìn)第一個(gè)表中)或者是要改變某一列的特性的話,對于系統(tǒng)來說是非常困難的,因?yàn)楸碇械臄?shù)據(jù)已經(jīng)一行行的存好了。

而NoSQL數(shù)據(jù)庫就減輕了數(shù)據(jù)建模的負(fù)擔(dān),比如上面的表里面的一行可以變成下面JSON文檔的樣子:

{

食物名稱:獼猴桃,

數(shù)量:4,

喜愛程度:5,

主人:{

姓名:小灰,

性別:男

}

}

這樣很方便的可以修改數(shù)據(jù)模型的樣子,而且從源數(shù)據(jù)不需要怎么改就可以放入數(shù)據(jù)庫。目前用有一個(gè)行業(yè)叫做ETL,就是專門做數(shù)據(jù)形狀轉(zhuǎn)化的:他們將不同的源數(shù)據(jù)打磨到想要的表格的模子里,然后放入關(guān)系型數(shù)據(jù)庫。這個(gè)行業(yè)價(jià)值好幾十億美元呢,很瘋狂吧?用了NoSQL,公司可以節(jié)省好多時(shí)間和人民幣呢。


小白:那是說NoSQL就是用文檔,而SQL就是用表格嗎?

答:NoSQL其實(shí)有很多不同的種類的,適用在不同的情況中并且分別有不同的存儲(chǔ)方法。JSON是文檔類NoSQL的典型格式,我們平時(shí)使用的word和pdf文件都可以很容易放入文檔型數(shù)據(jù)庫進(jìn)行查詢。而其他種類的NoSQL也可能是用圖或者哈希表的模型來存儲(chǔ)數(shù)據(jù)。如果你的數(shù)據(jù)存儲(chǔ)的是一個(gè)社交網(wǎng)絡(luò)類型的應(yīng)用,那么對你來說用一個(gè)基于圖的數(shù)據(jù)庫可能更加合適,因?yàn)槟汴P(guān)心的社交網(wǎng)絡(luò)場景中的問題都可以得到比較快速的回答。


小白問:既然叫NoSQL,那和SQL肯定是水火不容咯?

答:哪有,NoSql其實(shí)是Not Only SQL,就是不僅僅是SQL,有一些NoSQL數(shù)據(jù)庫還支持直接用SQL來做查詢呢。兩者的區(qū)別主要是我上面提到的兩點(diǎn): 1.對數(shù)據(jù)建模的要求不同:NoSQL的建模程序比較簡單靈活;2.對數(shù)據(jù)增加的處理方式不同:使用NoSQL可以直接進(jìn)行分布式處理。在數(shù)據(jù)規(guī)模增長需要增加新的機(jī)器的時(shí)候,不需要程序員對使用數(shù)據(jù)庫的應(yīng)用進(jìn)行代碼進(jìn)行改動(dòng),直接在數(shù)據(jù)庫集群中增加一臺(tái)新的計(jì)算機(jī)就可以啦。


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }