天天鼓搗數(shù)據(jù),你知道數(shù)據(jù)庫長啥樣嗎?(續(xù))

是的,你沒有看錯,不是發(fā)重了,本文就是大前天的文章《天天搗鼓數(shù)據(jù),你知道數(shù)據(jù)庫長啥樣?》的續(xù)篇。這幾天有些同學(xué)在后臺留言表示想進一步了解數(shù)據(jù)庫的相關(guān)技術(shù),確實之前的文章限于篇幅,只介紹了一些基本的概念,今天我們來把剩下的東西補一補。
現(xiàn)在,我假設(shè)你已經(jīng)被我成功灌輸了 「數(shù)據(jù)庫就是一個大文件,里面有很多表,每個表就像Excel一樣,存儲了若干條記錄」這樣的概念。但是,過年回家長輩問你什么是數(shù)據(jù)庫,光這樣回答是拿不到紅包的,所以我們繼續(xù)來深入探討一下下面幾個問題。
什么樣的數(shù)據(jù)適合用數(shù)據(jù)庫來存?
結(jié)構(gòu)化的數(shù)據(jù)。有的數(shù)據(jù),天生就有很好的結(jié)構(gòu),比如要記錄一個人,我們會這樣描述:羅玉鳳,女,1985年9月生,重慶市綦江區(qū)人。要記錄一部電影,這樣描述:《星球大戰(zhàn)》,導(dǎo)演喬治盧卡斯,科幻片。這樣記錄數(shù)據(jù)最大的好處是方便查詢,你要查鳳姐的身高,輸入「鳳姐,身高」兩個關(guān)鍵字就可以了。非結(jié)構(gòu)化的數(shù)據(jù),比如蒼老師.avi、小蘋果.mp3這些,就不適合用數(shù)據(jù)庫來存。你拍了一張鳳姐的照片準(zhǔn)備存起來,先不說能不能放到數(shù)據(jù)庫里,你要讓計算機根據(jù)一張圖片來得出鳳姐身高這樣的查詢結(jié)果,目前的科技水平還是很難做到。那非結(jié)構(gòu)化的數(shù)據(jù)怎么存呢?我上傳了一張個人頭像到微信上,微信的服務(wù)器就會把這個頭像的圖片文件存到服務(wù)器的硬盤上,然后把文件路徑存在數(shù)據(jù)庫里。這時候你再去請求這張頭像,輸入微信id,頭像這樣的關(guān)鍵詞,微信就會先去數(shù)據(jù)庫查你的頭像文件對應(yīng)的路徑,然后根據(jù)路徑在硬盤上找到文件回給你。
如何來設(shè)計一個數(shù)據(jù)庫?
什么?數(shù)據(jù)庫還需要設(shè)計?別慌,先來看個例子。你公司的程序員終于忍受不了產(chǎn)品經(jīng)理無節(jié)制的加需求,憤而離職,留下一個朋友圈消息后臺需要你親自上陣。用戶編輯完要發(fā)的消息之后,會發(fā)送到你這里,你需要把這些消息完整的存到數(shù)據(jù)庫。每一條消息是這樣的:
拿到這樣的數(shù)據(jù)之后,你應(yīng)該如何設(shè)計一張數(shù)據(jù)表的結(jié)構(gòu)呢?前面講過,表是由行和列組成的,每一列表示一個屬性,每一行表示一條信息。這個跟Excel對比起來很容易理解,每一列的屬性確定了之后就不變了,以后每來一條數(shù)據(jù),就添加一行。
這樣就可以滿足我們的需求了。但是,等數(shù)據(jù)量大了之后,我們就會發(fā)現(xiàn)這個表是有缺陷的。首先是數(shù)據(jù)冗余,每次李小花同學(xué)發(fā)表一條消息,就會把他的昵稱、性別、姓名重復(fù)插入到我們的表中。其次,如果在未來的某一天,李小花改了她的昵稱,那么我們要遍歷整張表去更新她的昵稱(可能現(xiàn)在已經(jīng)有上億條消息了),這也是不現(xiàn)實的。所以這里需要把表拆成user表和message表。拆表之后,通過姓名李小花既可以查到她的個人信息,又可以查到她發(fā)的所有消息。
這樣就可以完美解決上面的兩個問題了。這個過程叫規(guī)范化,就是說數(shù)據(jù)庫的設(shè)計是有一些規(guī)范的,這些規(guī)范經(jīng)過了嚴(yán)格的數(shù)學(xué)證明,你一定要遵守。
就差一個碼代碼的了。
之前的文章介紹了SQL語言,它是專門用來操作數(shù)據(jù)庫的。編程語言你可以理解為是一些命令串起來,每一條命令都可以讓系統(tǒng)實現(xiàn)一種功能。上面的兩張表,我們這樣來創(chuàng)建:
create_table user(姓名 varchar(20),昵稱 varchar(20),性別 varchar(10));
create_table message(姓名 varchar(20),時間 datetime,message text);
對表本身的操作除了創(chuàng)建,還有drop(刪除)、alter(更改屬性)等等。
當(dāng)有用戶新發(fā)表了一條消息,我們可以這樣插入到表中:
insert into message values(‘李小花’,now(),’I am very OK!’);
當(dāng)客戶端來了請求,要查詢王小龍同學(xué)的所有消息的時候,可以這樣:
select * from message where 姓名=’王小龍’;
對表內(nèi)數(shù)據(jù)的操作還有delete(刪除)、update(更改)等,當(dāng)然最精髓的還是查詢select了。我們?yōu)g覽貼吧看帖子,上微薄看熱門都是執(zhí)行的select命令,這個命令的執(zhí)行速度直接影響到用戶的體驗,所以程序員必須優(yōu)化好。
數(shù)據(jù)庫這塊兒的東西先講到這里,一些代碼大家看不懂沒關(guān)系,如果以后用的上,知道是怎么回事兒再去查就能學(xué)的很快。但是,即使知識get到了也千萬不要去程序員那兒秀技術(shù),程序員都覺得自己技術(shù)最牛b,你就讓他繼續(xù)牛b下去,對產(chǎn)品經(jīng)理也沒啥壞處,哈哈。
相關(guān)閱讀:
天天鼓搗數(shù)據(jù),你知道數(shù)據(jù)庫長啥樣嗎?
#專欄作家#
給產(chǎn)品經(jīng)理講技術(shù),微信公眾號(pm_teacher),人人都是產(chǎn)品經(jīng)理專欄作家。資深程序猿,專注客戶端開發(fā)若干年,對前端、后臺技術(shù)略懂,熱衷于對新的科技領(lǐng)域的探索。
本文原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,不得轉(zhuǎn)載。
求推薦一本給小白普及技術(shù)的書,不懂技術(shù)的產(chǎn)品跟技術(shù)溝通困難重重
用戶ID
關(guān)于服務(wù)器和數(shù)據(jù)庫的文章可以多寫點,因為專注于前端開發(fā)和不懂技術(shù)的產(chǎn)品經(jīng)理們需要這些基本的技術(shù)常識,這樣可以降低溝通成本,提高溝通效率,有時候,1句話,大家都能馬上聽懂,立刻執(zhí)行
期待你寫更多這樣的文章哈~