4.3 系鈴鐺的玩具貓-資料庫的前世今生
來自專欄 產品經理的技術修養
大數據時代
小奈:表哥,為什麼瀏覽器好像什麼都知道的?我只是剛剛搜了下感冒怎麼治,現在就彈出xx醫院廣告了。
大仁:當xx公司有了海量的數據,再根據這些數據進行精準營銷(廣告),他們每年都可以掙一大筆廣告費。大仁:廣告雖然令人厭惡,但是數據推薦還是必要的,尤其是在信息大爆炸的時代,讓信息更精準的出現在你手裡。
大數據時代:人還需要隱私么?(不授權不給用)
視頻地址
用個人信息支付有打折,然後信息就被賣了
DBA
小奈:表哥,公司最近好像在招聘DBA(資料庫管理員),後端工程師不就可以管理資料庫的么?資料庫和後端有什麼區別?資料庫又是什麼呢?
大仁:看來你們公司是大公司喔,一般小公司沒有dba的崗位。其實我們常說的後端工程師,他們也設計和管理資料庫。但是如果數據到了一定量級,資料庫性能調優、安全穩定就需要專業的dba。資料庫發展史資料庫是什麼?
大數據背後的一塊塊基石,則是資料庫。
資料庫背後有好多故事,你可能不知道資料庫,但是最近火的不行區塊鏈,其實就是去中心化的分散式資料庫。
說完高大上的區塊鏈,我們開始回溯資料庫的發展吧文件&文件系統
內存籃子最開始是計算機的出現,那時候沒有硬碟,只有內存,數據不會進行存儲,一般只用於科技計算,計算完輸出結果後,程序就撤出內存了。
後來技術發展,才有了硬碟、文件,在文件的基礎上有了文件系統。文件系統可以滿足數據存放和查找的需求。資料庫的誕生
文件系統作為資料庫用了一段時間,當數據越來越多、規模越來越大後,數據查找特別麻煩。數據很容易重複(冗餘)、佔用存儲空間多,數據結構化被迫推進。
文件系統 vs 資料庫文件系統和資料庫的主要區別是?
簡單舉個例子,如上圖所示。我們理解的數據和文件比較接近,例如文件1存放了玩具狗的數據,文件2存放了系鈴鐺的狗的數據。但其實玩具狗、玩具貓都是玩具,鈴鐺和玩具是可以拆分的。資料庫的結構化(玩具庫架子),讓數據不會重複,玩具狗可以系鈴鐺,也可以不系。
關係型資料庫
資料庫出現後,慢慢演化出關係型資料庫,之後又演化成非關係型資料庫。我們首先介紹關係型資料庫,什麼是關係型資料庫?
關係數據就是指數據之間是有關係的。像是上圖中系鈴鐺的玩具狗,鈴鐺是屬於(系在)玩具狗,那我把鈴鐺取下來放到玩具貓上可以么?可以,那關係就變了,鈴鐺在資料庫里的記錄變更為屬於貓。 其實資料庫有個(存儲的關係規範)資料庫範式,第一範式到到第五範式。玩具狗與鈴鐺的拆分只是滿足了第一範式,越往下數據的壓縮率就越高,相應的存儲也會變慢(需要關係範式驗證)。結構化、共享訪問的資料庫的除了是結構化存儲、它還可以共享給程序訪問。文件系統時候,程序a讀取文件1(小明的玩具),資料庫時代,所有程序只要有許可權就可以訪問所有資料庫里的數據(大家的玩具共享)。
數據表長什麼樣
數據:例如玩具狗,他的各個欄位:玩具名稱、是否有耳朵、多少條腿等等,玩具狗的所有信息算是一條數據。
數據表:玩具表就像一個excel表格,裡面存了所有玩具的數據。手機資料庫:sqlite
運存倉庫網頁和app的區別大家也都知道了,手機里有資料庫,手機app的資料庫和沙河一樣,每個app都有自己倉庫。
redis、memcache
不知道大家看視頻的時候,是否喜歡快進,或者回放。
視頻文件=幾十萬張圖片(簡單約等於),圖片文件非常多。如果經常要重複從資料庫中取出相同的數據,這種重複極大的增加了資料庫負載。緩存是解決這個問題的好辦法。瀏覽器中的雖然已經可以實現對頁面局部進行緩存,但還是不夠靈活,主要是視頻文件。此時Memcached或許是你想要的,當你看一個視頻來回拉動進度的時候,本地緩存很重要。nosql
隨著經濟發展,村裡小孩越來越多了(雲計算的到來),玩具廠每年生產的玩具也多了。一個玩具庫(單機)不夠用了,所以要多建立幾個公共玩具庫,玩具存放在不同的玩具庫(多台計算機)。為了滿足數據爆髮式增長的存儲需求,資料庫部署在多台計算機上,也就是分散式資料庫,但是分散式和單機不同的地方在於關係嚴格性上,分散式要求數據關係不那麼嚴格(半結構化),主要是擴容和大數據存儲,所以Nosql(not only sql)就誕生了。
常見的Nosql有mongodb、hbase等,這裡以mongodb為例。資料庫連接
var mongoose = require(mongoose)
var db = mongodb://127.0.0.1/test;mongoose.connect(db, {server: { poolSize: 20 }}, function (err) {if (err) {
console.log(connect to %s error:, db, err.message)process.exit(1)} else {console.log(connected)}})
增刪改查
var UserSchema = new Schema({
name: { type: String},phone: { type: Number}})
var User = mongoose.model(User, UserSchema);//create 增加var user1 = new User();user1.name = jack1;user1.phone = 123456;user1.save(function (err) {if (err) {console.log(err.message)}})
var user2 = new User();user2.name = jack2;user2.phone = 234567;user2.save(function (err) {if (err) {console.log(err.message)}})//查找User.find(function (err, users) {
if (err) {return console.error(err)}else {console.log(users)}})
分散式vs集群
很多人可能會混淆分散式和集群的概念,分散式更像是業務拆分到不同伺服器上,集群則是多台伺服器一起處理同個業務。比較複雜,後續再解釋。
資料庫圖鑑
目前市面上常見的資料庫品牌,主要有關係型和非關係型資料庫兩種。計算機世界發展快速,資料庫就像一個大生態,愈發多態化多樣化。
- 關係型:Oracle、mysql、Postgresql
- nosql: mongodb、hbase
區塊鏈:去中心化的分散式資料庫
回到區塊鏈,大數據時代無隱私,區塊鏈的去中心化能否保護隱私?
首先得介紹下去中心化,那麼中心化又是什麼?中心化就是我們常見的通訊模型,客戶端需要以伺服器獲取數據(服務端和資料庫交互),上次我們也講過 輸入url 後發生的事情,如果兩個客戶端之間互相知道彼此的地址,他們可以直接建立通訊。p2p技術常用於資源共享、音視頻等。中心化vs去中心化區塊鏈本質上是一種去中心化的分散式資料庫,該資料庫是由一串使用密碼學方法產生的數據區塊按時間順序有序連接而成,每個數據塊中包含了一段時間內的全網產生的無法篡改的數據記錄信息。
區塊鏈技術讓我們的隱私得到了一定程度上的保護。 關於網路通訊、區塊鏈後續繼續展開。失控
最後引用下凱文*凱里在《失控》里的一段話:
沒有強制性的中心控制,次級單位具有資質的性質:次級單位之間批次高度連接,點對點間的影響通過網路形成了非線性因果關係。
計算機的高速發展,資料庫不斷進化,大數據越來越精確化,越來越智能,但用戶也需要隱私,區塊鏈這種去中心化、自組織的形態會不會成為新趨勢?
推薦閱讀:
※簡析關係型資料庫和非關係型資料庫的比較(下)
※常用科研軟體和計算資料庫鏈接 (持續更新)
※實習小記
※Mysql資料庫主從心得整理
※Python徒手實現識別手寫數字—簡易圖片資料庫