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