緊接著上次的進(jìn)度(點(diǎn)此查看第一篇)窍侧,這次放出第二部分的內(nèi)容。
3.產(chǎn)品經(jīng)理學(xué)編程
3.1 ?產(chǎn)品經(jīng)理為什么要學(xué)編程
對(duì)于產(chǎn)品經(jīng)理這一綜合性職能來(lái)說(shuō)瓤湘,具備一定的技術(shù)知識(shí)泊脐,不論是在與工程師工作的配合中,還是在對(duì)技術(shù)產(chǎn)品的理解上课蔬,都能起到非常大的幫助作用囱稽。所以,掌握一定的編程知識(shí)二跋,對(duì)于了解技術(shù)產(chǎn)品和技術(shù)實(shí)現(xiàn)思維都有一定的好處战惊。
什么是編程語(yǔ)言:
編程語(yǔ)言是程序設(shè)計(jì)人員與計(jì)算機(jī)進(jìn)行交互的指令集,在計(jì)算機(jī)中任何邏輯和表達(dá)都可以通過(guò)編程語(yǔ)言來(lái)實(shí)現(xiàn)同欠。對(duì)于同一個(gè)產(chǎn)品功能样傍,我們可以用不同的編程語(yǔ)言來(lái)開(kāi)發(fā)横缔。
選用哪種編程語(yǔ)言一般取決于系統(tǒng)架構(gòu)師綜合衡量后的選擇,系統(tǒng)架構(gòu)師就是軟件產(chǎn)品的技術(shù)總設(shè)計(jì)師衫哥,負(fù)責(zé)規(guī)劃和選用技術(shù)實(shí)現(xiàn)方案茎刚,類似于建筑設(shè)計(jì)師的角色。不同的系統(tǒng)需要根據(jù)系統(tǒng)特性選擇合適的編程語(yǔ)言撤逢。
3.2 ?主流編程語(yǔ)言介紹
每一位工程師都有自己擅長(zhǎng)的語(yǔ)言膛锭,作為非技術(shù)產(chǎn)品經(jīng)理,一定要區(qū)分不同的編程語(yǔ)言蚊荣,如果讓一位只開(kāi)發(fā)Android應(yīng)用的工程師去改iOS應(yīng)用的代碼初狰,或者做客戶端的同學(xué)去幫助服務(wù)端的同學(xué)開(kāi)發(fā),那會(huì)成為笑話的互例。當(dāng)然奢入,也有所謂的全棧工程師,精通多門(mén)技術(shù)媳叨,可以跨領(lǐng)域工作腥光。下面介紹幾種主流編程語(yǔ)言:
C語(yǔ)言:C語(yǔ)言運(yùn)用于個(gè)人計(jì)算機(jī)、大型和超大型計(jì)算機(jī)糊秆、路由器以及可編程的集成電路里武福。C語(yǔ)言起源于20世紀(jì)70年代,其奠基人是美國(guó)人丹尼斯里奇(Dennis Ritchie)痘番,他被成為“C語(yǔ)言之父”捉片,同時(shí)也是早期非常有名的操作系統(tǒng)Unix的發(fā)明人,前文提到的Linux系統(tǒng)很大程度上是基于Unix系統(tǒng)的思想演化而來(lái)的汞舱。C語(yǔ)言的出現(xiàn)開(kāi)啟了現(xiàn)代編程語(yǔ)言發(fā)展的序幕伍纫,后來(lái)的C++、Java等編程語(yǔ)言都是基于C語(yǔ)言發(fā)展而來(lái)的兵拢。
Java:Java語(yǔ)言也是如今主流編程語(yǔ)言之一翻斟,以其跨平臺(tái)、通用性和安全性的特點(diǎn)被廣泛使用说铃。Java是一門(mén)面向?qū)ο蟮恼Z(yǔ)言访惜,相對(duì)于C語(yǔ)言等面向過(guò)程的語(yǔ)言來(lái)說(shuō),Java的靈活性更高腻扇,同時(shí)其抽象現(xiàn)實(shí)世界的特點(diǎn)對(duì)于程序設(shè)計(jì)人員的學(xué)習(xí)和理解也更用幫助债热。
PHP:在Web開(kāi)發(fā)領(lǐng)域,一門(mén)比較主流的編程語(yǔ)言就是PHP(PHP:Hypertext Preprocesspr)幼苛。PHP是一種開(kāi)源腳本語(yǔ)言窒篱,腳本語(yǔ)言通常以文本形式被保存,只有在調(diào)用時(shí)進(jìn)行解釋和編譯,相對(duì)于C語(yǔ)言或者Java語(yǔ)言來(lái)說(shuō)墙杯,PHP更加輕量化且更靈活配并,PHP吸收了C語(yǔ)言和Java的特點(diǎn),學(xué)習(xí)成本較低高镐,主要應(yīng)用于Web開(kāi)發(fā)領(lǐng)域溉旋。
JavaScript:JavaScript也是一種腳本開(kāi)發(fā)語(yǔ)言,主要運(yùn)行在瀏覽器中嫉髓,可以為網(wǎng)頁(yè)增加動(dòng)態(tài)功能观腊。JavaScript雖然名字里有Java字樣,但其實(shí)和Java沒(méi)有太大關(guān)系算行。
除了上述幾種編程語(yǔ)言梧油,還有很多主流編程語(yǔ)言,比如C++州邢、Python儡陨、Ruby等。近幾年隨著移動(dòng)互聯(lián)網(wǎng)的普及量淌,基于蘋(píng)果iOS系統(tǒng)所使用的Objective-C迄委、Swift語(yǔ)言也發(fā)展迅速。
3.3 ?編程語(yǔ)言中的數(shù)據(jù)類型
數(shù)據(jù)類型是用來(lái)在計(jì)算機(jī)世界中區(qū)分和表達(dá)數(shù)據(jù)載體的規(guī)則类少,數(shù)據(jù)類型是一種對(duì)數(shù)據(jù)的約束,每一種數(shù)據(jù)都有一種且唯一一種數(shù)據(jù)類型渔扎,數(shù)據(jù)類型代表編程語(yǔ)言中的最基本規(guī)則硫狞。“數(shù)據(jù)”是計(jì)算機(jī)世界中的基本單元,一張圖片是一個(gè)數(shù)據(jù)晃痴,一個(gè)文字也是一個(gè)數(shù)據(jù)残吩。如下圖所示,一個(gè)基本的數(shù)據(jù)單元主要由幾部分構(gòu)成倘核,分別是數(shù)據(jù)類型泣侮、數(shù)據(jù)名稱和數(shù)據(jù)值。數(shù)據(jù)的名稱也叫變量名紧唱,每一個(gè)變量都有對(duì)應(yīng)的數(shù)據(jù)值活尊。
每一門(mén)編程語(yǔ)言都有自己的基礎(chǔ)語(yǔ)法,就像我們學(xué)外語(yǔ)需要掌握語(yǔ)法一樣漏益。編程語(yǔ)言是和計(jì)算機(jī)進(jìn)行溝通的語(yǔ)言蛹锰。計(jì)算機(jī)要理解成語(yǔ)的意思,首先就得從數(shù)據(jù)類型開(kāi)始绰疤,數(shù)據(jù)類型好比我們說(shuō)話用的單詞的意思铜犬,計(jì)算機(jī)需要理解我們傳遞了什么信息。另外就是語(yǔ)法結(jié)構(gòu),好比我們說(shuō)的單詞需要以什么樣的順序和方式被組織起來(lái)癣猾,不同的外語(yǔ)里有不同的語(yǔ)法規(guī)則敛劝,也有不同的單詞,例如表示蘋(píng)果這一物體纷宇,中文里叫“蘋(píng)果”夸盟,但英文里叫“apple”,中文的主謂語(yǔ)順序和英語(yǔ)中的也略有差別呐粘。同理满俗,在編程語(yǔ)言中也會(huì)有不同的語(yǔ)法規(guī)則和不同的關(guān)鍵字。我們先看一下編程語(yǔ)言中的基本數(shù)據(jù)類型作岖。
3.3.1 表示整數(shù)的“整型”
在產(chǎn)品中唆垃,我們通常會(huì)在需要計(jì)算一些數(shù)值時(shí)使用到整型,比如需要統(tǒng)計(jì)通訊錄有多少人時(shí)痘儡,需要聲明一個(gè)整型變量來(lái)記錄通訊錄項(xiàng)目總數(shù)辕万,而且這個(gè)變量是可以持續(xù)累加進(jìn)行計(jì)算的。
整型是一種數(shù)字類型沉删,所有的不帶小數(shù)點(diǎn)的數(shù)字都屬于整型渐尿,在編程語(yǔ)言中,用關(guān)鍵詞int來(lái)表示整型矾瑰。關(guān)鍵詞是編程語(yǔ)言中一種約定存在的表示一定具體意義的形容詞砖茸,關(guān)鍵字一般都是固定存在的,就好比語(yǔ)言中的一些固定詞語(yǔ)殴穴。在程序中凉夯,我們可以給變量取一個(gè)名字采幌,然后聲明這個(gè)變量誒整型休傍,例如“int a=10”征绎,這是一個(gè)基本的程序語(yǔ)句磨取,里面有幾個(gè)關(guān)鍵字符號(hào),從左到右忙厌,首先是“int”,說(shuō)明這個(gè)數(shù)據(jù)類型被我們聲明為整型隘截,也就是整數(shù)類型婶芭,然后是“a”犀农,這是我們隨便取的名字呵哨,我們還可以叫x或者y都行孟害,再往后就是“=”挨务,這個(gè)等號(hào)其實(shí)是賦值號(hào)丁侄,代表的意思是鸿摇,將“10”的這個(gè)整數(shù)賦值給變量“a”户辱。至此,我們就完成了一個(gè)簡(jiǎn)單地程序語(yǔ)句变逃。同時(shí)揽乱,整型是可以被用來(lái)進(jìn)行數(shù)學(xué)計(jì)算的,例如我們將兩個(gè)整數(shù)進(jìn)行加減乘除的數(shù)學(xué)計(jì)算撒犀,“int a=1或舞;int b=2胆筒;int c=a+b”仆救,在這條程序語(yǔ)句中彤蔽,最終變量“c”的計(jì)算結(jié)果是“3”铆惑。
3.3.2 表示文本的“字符型”
字符型是一種文本類型,字符型的內(nèi)容沒(méi)有規(guī)則限制撕阎,可以是任意內(nèi)容虏束。在不同的編程語(yǔ)言中,表示字符型的關(guān)鍵字略有不同汗侵。例如在Java語(yǔ)言中晰韵,我們使用關(guān)鍵字String來(lái)表示字符型數(shù)據(jù);在C語(yǔ)言中只恨,字符型使用關(guān)鍵字char來(lái)表示坤次;在Objective-C語(yǔ)言中用NSString表示字符型數(shù)據(jù)产艾。字符型數(shù)據(jù)一般會(huì)用引號(hào)表示該數(shù)據(jù)屬于字符型闷堡,例如“hello”就是一個(gè)字符類型的數(shù)據(jù),表示一個(gè)單詞踱阿,也可以是“hello world”软舌,表示一句話,中間的空格也算是這個(gè)字符型數(shù)據(jù)的一部分超营。如果字符型數(shù)據(jù)的內(nèi)容是數(shù)字演闭,比如“1024”,這時(shí)候并不代表是整數(shù),而就是一個(gè)字符型數(shù)據(jù)工猜。也就是說(shuō)史侣,字符型的“1024”并不具備數(shù)學(xué)意義惊橱,不能用來(lái)做計(jì)算。
字符型的數(shù)據(jù)在我們?cè)O(shè)計(jì)產(chǎn)品的過(guò)程中其實(shí)使用得最多正林,我們?cè)诋a(chǎn)品界面上展示的所有信息在程序里都是以字符型的數(shù)據(jù)類型展示的,例如用戶登錄界面上看到的用戶名杈绸、密碼的文字瞳脓,以及輸入的用戶名和密碼(這些內(nèi)容會(huì)以字符型的數(shù)據(jù)被程序讀取,然后做進(jìn)一步處理)板辽。可以說(shuō)邑跪,字符型是適應(yīng)最廣泛的一種數(shù)據(jù)類型画畅。
3.3.3 表示小數(shù)的“浮點(diǎn)型”
浮點(diǎn)型也是一種數(shù)字類型,與整數(shù)型相比淫僻,浮點(diǎn)型的數(shù)據(jù)都是帶小數(shù)點(diǎn)的數(shù)據(jù)棕所。在編程語(yǔ)言中,一般用float或者double標(biāo)記浮點(diǎn)型數(shù)據(jù)。在產(chǎn)品設(shè)計(jì)中,我們會(huì)用到浮點(diǎn)型,例如在填寫(xiě)體重的時(shí)候,我們可以輸入“60.5”這樣的數(shù)值來(lái)表示公斤嗓节,在一些專業(yè)型的工具產(chǎn)品中,我們會(huì)輸入一些帶小數(shù)點(diǎn)的數(shù)來(lái)設(shè)置一些參數(shù)鸵隧,這時(shí)都會(huì)使用到浮點(diǎn)型。當(dāng)然外驱,如前文所說(shuō),在界面上獲取的其實(shí)都是字符型瓦哎,只是我們?cè)诔绦蚶锩鎸⒆址娃D(zhuǎn)換為了浮點(diǎn)型。
3.3.4 表示是非判斷的“布爾型”
布爾型是一種特殊的數(shù)據(jù)類型羡铲,布爾型的數(shù)據(jù)只有兩種值,即“true”和“false雷恃。“true”對(duì)應(yīng)的序號(hào)是1讨越,“false”對(duì)應(yīng)的序號(hào)是0。布爾型變量的賦值只能是“true”或者“false”着逐,一般用來(lái)做標(biāo)記使用,反應(yīng)現(xiàn)實(shí)世界里的p真假判斷太雨。在編程語(yǔ)言中,一般用關(guān)鍵字“boolean”或者“bool”表示和聲明布爾型數(shù)據(jù)锥咸。
在產(chǎn)品設(shè)計(jì)中,我們經(jīng)常會(huì)在流程設(shè)計(jì)里使用到布爾型雪侥。例如锌妻,如果用戶在注冊(cè)時(shí)需要同意一個(gè)注冊(cè)協(xié)議,注冊(cè)協(xié)議旁邊往往有一個(gè)可以勾選的小框吭历,勾上視為同意,不勾視為不同意。
在程序?qū)崿F(xiàn)中捡偏,我們可以使用布爾型的數(shù)據(jù)對(duì)這個(gè)操作進(jìn)行記錄。例如彤避,我們可以設(shè)置一個(gè)變量來(lái)記錄這個(gè)操作,“boolean isSelected = false”圆米,我們聲明了一個(gè)變量名字叫做“isSelected”,然后給它初始賦值為“false”,即設(shè)定默認(rèn)是沒(méi)有勾選的削葱,如果用戶在注冊(cè)時(shí)將勾選項(xiàng)選上遂蛀,我們就可以將這個(gè)變量的值修改為“true”螃宙。布爾型在程序設(shè)計(jì)中使用得較多挂捅,主要用于控制流程或者做一些特殊標(biāo)記。
3.3.5 數(shù)據(jù)類型間的轉(zhuǎn)換
前面我們提到了編程語(yǔ)言中三種最常見(jiàn)的數(shù)據(jù)類型伺糠,分別是整型、字符型和浮點(diǎn)型。除了這三種基礎(chǔ)類型外午绳,還有一些其他類型,例如長(zhǎng)整型、單精度浮點(diǎn)型和雙精度浮點(diǎn)型螟够,這些都是基于基礎(chǔ)數(shù)據(jù)類型的其他數(shù)據(jù)類型若河,它們一起構(gòu)成了程序的數(shù)據(jù)基礎(chǔ)。前文提到的數(shù)據(jù)類型間的轉(zhuǎn)換,例如我們從界面上獲取的整型數(shù)據(jù)輸入實(shí)際上首先得到的是字符型悟民。這時(shí),我們就需要將字符型轉(zhuǎn)換為整型,在大部分編程語(yǔ)言中窟绷,都會(huì)有對(duì)應(yīng)的工具來(lái)進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。
3.3.5 數(shù)據(jù)拼接
在編程語(yǔ)言中,數(shù)據(jù)拼接一般是字符型數(shù)據(jù)間的拼接,拼接后的字符型數(shù)據(jù)統(tǒng)稱為字符串涉瘾,字符串的內(nèi)容可以表達(dá)任何內(nèi)容,字符串簡(jiǎn)單來(lái)說(shuō)就是一串文本捷兰,如前文所說(shuō)立叛,“1024“是一個(gè)文本,也就是一個(gè)字符串贡茅,并不是數(shù)學(xué)意義上的1024秘蛇,字符串所能表達(dá)的內(nèi)容非常多,字符串的內(nèi)容既可以是數(shù)字也可以是小數(shù)或者各種符號(hào)赁还。
產(chǎn)品設(shè)計(jì)中妖泄,假設(shè)我們要設(shè)計(jì)一個(gè)功能展示多少人參與了活動(dòng),文本會(huì)設(shè)計(jì)成“目前有XX人參與了本次活動(dòng)”艘策,這句話在程序里是以字符型的數(shù)據(jù)類型存儲(chǔ)的蹈胡,整個(gè)字符串中間關(guān)于多少人的部分是變量,也就是說(shuō)這里的數(shù)字實(shí)惠動(dòng)態(tài)變化的朋蔫。在編程中罚渐,我們用到數(shù)據(jù)拼接來(lái)實(shí)現(xiàn),以Java語(yǔ)言為例驯妄,第一種是我們現(xiàn)將“目前有”這個(gè)字符串用變量“a”表示荷并,將后面的“人參與了本次活動(dòng)”這個(gè)字符串用變量“c”表示,中間的數(shù)字我們?cè)诔绦蛑蝎@取時(shí)是整型數(shù)據(jù)富玷,先將整型轉(zhuǎn)換為字符型然后用變量“b”表示。這時(shí)我們通過(guò)“String s = a + b + c”這條程序語(yǔ)句就可以實(shí)現(xiàn)字符串?dāng)?shù)據(jù)的拼接既穆,從而實(shí)現(xiàn)這個(gè)功能赎懦。
在進(jìn)行產(chǎn)品設(shè)計(jì)時(shí),如果某個(gè)功能涉及固定字符和動(dòng)態(tài)字符的組合幻工,就要考慮數(shù)據(jù)拼接了励两。
3.4 ?編程語(yǔ)言中的邏輯結(jié)構(gòu)
編程語(yǔ)言中的邏輯結(jié)構(gòu)類似于我們所說(shuō)的語(yǔ)言中的語(yǔ)法,是用來(lái)組織和表達(dá)語(yǔ)義的規(guī)則囊颅。實(shí)際上当悔,編程就是把現(xiàn)實(shí)世界的狀態(tài)和過(guò)程通過(guò)程序語(yǔ)言在計(jì)算機(jī)里寫(xiě)出來(lái),然后讓告訴計(jì)算機(jī)去執(zhí)行踢代。
3.4.1 條件判斷“if else”
“if”和“else”在英語(yǔ)中的意思是“如果”和“否則”盲憎。在編程語(yǔ)言中,我們可以用這兩個(gè)關(guān)鍵字來(lái)控制邏輯判斷流程胳挎。舉個(gè)栗子饼疙,我們需要判斷用戶登錄時(shí)是否輸入了用戶名和密碼,如果用戶名和密碼輸入框?yàn)榭漳脚溃俏覀兙吞崾居脩粝嚓P(guān)信息窑眯;如果都不為空,那我們就執(zhí)行登錄的操作医窿。用編程語(yǔ)言中的“if else”控制可以按如下寫(xiě)法磅甩。
If (用戶名和密碼不為空)? {
執(zhí)行登錄操作
}else{
提示用戶相關(guān)信息
}
上面就是一段簡(jiǎn)單的“代碼”片段,但實(shí)際上它不是真正的代碼姥卢,因?yàn)檎嬲拇a是不能用中文編寫(xiě)的卷要。關(guān)于條件判斷的邏輯結(jié)構(gòu)渣聚,還有如下寫(xiě)法。
If (條件1) ?{
執(zhí)行結(jié)果1;
}else if (條件2) {
執(zhí)行結(jié)果2;
}else{
執(zhí)行結(jié)果3
}
3.4.2 條件選擇“switch case”
我們用自動(dòng)售貨機(jī)買東西却妨,如果有5元饵逐、10元和15元的東西可供購(gòu)買,那我們投入5元彪标,就能選擇5元的商品倍权;如果投入10元或者15元,那我們可以選擇10元或者15元的商品捞烟;如果投入的錢(qián)無(wú)法識(shí)別薄声,則會(huì)退回并做相應(yīng)的提示。這就是條件選擇邏輯题画,在程序中我們可以用如下方式來(lái)表示默辨。
switch(錢(qián)的面值)
case 5:
選購(gòu)5元商品;
case 10:
選購(gòu)10元商品苍息;
case 15:
選購(gòu)15元商品缩幸;
default:
退回并提示無(wú)法識(shí)別:
}
從上邊的”偽代碼“中可以看到“switch”后面的括號(hào)里對(duì)投入的錢(qián)的面值進(jìn)行了判斷。需要注意的是竞思,在“switch case”條件選擇中表谊,條件值的數(shù)據(jù)類型必須是整型的,也就是說(shuō)其他數(shù)據(jù)類型的值是不能使用的盖喷”欤“case”是對(duì)應(yīng)輸入值的條件分支,“case”對(duì)應(yīng)值得數(shù)據(jù)類型也必須是整型课梳,每一個(gè)“case”的分支都會(huì)有一個(gè)對(duì)應(yīng)的執(zhí)行結(jié)果距辆,例如輸入的值是5,條件選擇會(huì)執(zhí)行第一個(gè)“case”部分的內(nèi)容暮刃,即“選購(gòu)5元商品’跨算。條件選擇執(zhí)行順序從上至下,如果輸入的值是15椭懊,那經(jīng)過(guò)前兩個(gè)“case”的條件判斷后漂彤,執(zhí)行第3個(gè)“case”選項(xiàng)的工作。若輸入的值在所有的“case”中都沒(méi)有匹配項(xiàng)灾搏,那還有一個(gè)關(guān)鍵字“default”表示的默認(rèn)執(zhí)行模塊挫望,如果所有的條件都不滿足,就執(zhí)行該模塊的內(nèi)容狂窑。
案例分析:在電商產(chǎn)品購(gòu)物環(huán)節(jié)中媳板,我們選擇商品時(shí)往往需要選擇商品的尺寸或者顏色,對(duì)尺寸和顏色的選擇就對(duì)應(yīng)程序中的“switch case”邏輯泉哈。
3.4.3 循環(huán)操作“while/do while”
英文單詞“while”有“一段時(shí)間”的意思蛉幸,在編程語(yǔ)言中破讨,我們可以使用“while”實(shí)現(xiàn)循環(huán)的邏輯控制,循環(huán)邏輯控制是指讓一個(gè)事件在某一個(gè)條件下重復(fù)發(fā)生奕纫,在循環(huán)停止前持續(xù)讓這個(gè)事件發(fā)生一段時(shí)間提陶。一個(gè)馴化的邏輯往往有循環(huán)條件,例如需要循環(huán)幾次匹层,需要滿足什么條件才能進(jìn)行下一次循環(huán)隙笆,以及滿足什么條件時(shí)結(jié)束循環(huán)等。
在現(xiàn)實(shí)世界中升筏,我們經(jīng)常會(huì)遇到一些需要使用循環(huán)邏輯的場(chǎng)景撑柔,例如倒計(jì)時(shí)(從某個(gè)數(shù)開(kāi)始倒數(shù)一直到0),在這個(gè)過(guò)程中通過(guò)編程語(yǔ)言實(shí)現(xiàn)就是使用循環(huán)邏輯您访。以倒計(jì)時(shí)為例铅忿,我們來(lái)看如下“代碼”片段。
int i = 0灵汪;
while (i < 3){
i++;
}
以上就是一個(gè)簡(jiǎn)單的循環(huán)邏輯檀训,首先通過(guò)關(guān)鍵字“while”表明這是一個(gè)循環(huán)。首先享言,定義一個(gè)整數(shù)型的變量i峻凫,并且為i賦值為數(shù)字0。在while后面的括號(hào)里有一個(gè)判斷條件担锤,判斷i是否小于3蔚晨,則執(zhí)行大括號(hào)里的程序語(yǔ)句乍钻。在大括號(hào)里的程序語(yǔ)句完成了對(duì)i的值得自增肛循,而且每次都加1.第一次循環(huán)后,i的值變成了1银择,第二次循環(huán)后i的值變?yōu)?多糠,第3次循環(huán)后i的值變?yōu)?,第四次循環(huán)發(fā)生時(shí)浩考,由于此時(shí)i的值已經(jīng)是3了夹孔,并不小于3,所以while后面括號(hào)里的條件不成立析孽,循環(huán)結(jié)束搭伤。在這個(gè)過(guò)程中,需要循環(huán)發(fā)生的時(shí)間是“i++”袜瞬,根據(jù)循環(huán)控制初始狀態(tài)“i=0”和循環(huán)結(jié)束狀態(tài)“i<3”怜俐,循環(huán)總共發(fā)生了3次。
3.5 ?數(shù)據(jù)的組織方式:數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)和組織數(shù)據(jù)的一種方式邓尤,是按照一定規(guī)則進(jìn)行數(shù)據(jù)組織的數(shù)據(jù)的集合拍鲤。通過(guò)編程語(yǔ)言把產(chǎn)品功能的邏輯表達(dá)出來(lái)贴谎,邏輯的基本單元是數(shù)據(jù),數(shù)據(jù)通過(guò)一定的結(jié)構(gòu)呈現(xiàn)出來(lái)季稳。
接下來(lái)擅这,我們介紹幾種常用的數(shù)據(jù)結(jié)構(gòu)。
3.5.1 數(shù)組:統(tǒng)一數(shù)據(jù)類型的集合
數(shù)組是指具有相同數(shù)據(jù)類型的數(shù)據(jù)元素組成的集合景鼠。數(shù)組同樣有數(shù)據(jù)類型仲翎,而且一個(gè)數(shù)組內(nèi)只能同時(shí)存在一種數(shù)據(jù)類型。如果定義一個(gè)整型數(shù)組莲蜘,那么數(shù)組里的元素就只能是整型數(shù)據(jù)谭确。
數(shù)組可以指定大小,而且數(shù)組里的元素可以通過(guò)數(shù)組下標(biāo)標(biāo)記和獲取票渠,如下圖所示逐哈。
我們定義一個(gè)整型數(shù)組,并且指定這個(gè)數(shù)組的大小是3问顷,可以寫(xiě)成“int a[3]”昂秃,前面的“int”表示數(shù)組的數(shù)據(jù)類型,“a”表示這個(gè)數(shù)組的名字杜窄,也就是之前提到過(guò)得變量名肠骆,中括號(hào)表示這是一個(gè)數(shù)組,括號(hào)里面的3表示這個(gè)數(shù)組的大小是3塞耕,也就是說(shuō)能存放3個(gè)數(shù)組元素蚀腿。完整的寫(xiě)法應(yīng)該是“int a[3]={1,2,3}”這句程序的意思就是我們初始化了一個(gè)名為“a”的整形數(shù)組,并且制定了數(shù)組的大小為3扫外,且初始值分別為1莉钙、2和3三個(gè)整數(shù)。
數(shù)組中的元素可以通過(guò)下標(biāo)獲取筛谚,在編程語(yǔ)言中磁玉,數(shù)組的下標(biāo)一般是從0考試,比如要取數(shù)組“a”中的第一個(gè)整數(shù)1的時(shí)候驾讲,通過(guò)“a[0]”的方式就能取到蚊伞,完整的寫(xiě)法是“int a1=a[0]”,這里的意思是我們定義了一個(gè)變量“a1”用來(lái)存儲(chǔ)數(shù)組“a”中的第一個(gè)元素的值吮铭,“a1”的值就是整數(shù)1.
在設(shè)計(jì)產(chǎn)品實(shí)現(xiàn)方案的時(shí)候时迫,我們經(jīng)常使用數(shù)組。例如谓晌,類似微信聊天列表一類的設(shè)計(jì)掠拳,我們?cè)趯?shí)現(xiàn)時(shí)首先將需要展示的數(shù)據(jù)集中存放在數(shù)組里,然后在渲染界面的時(shí)候從數(shù)組中把數(shù)據(jù)元素取出來(lái)扎谎,然后再展示到界面上碳想。數(shù)組是在程序設(shè)計(jì)中使用比較多的一種數(shù)據(jù)結(jié)構(gòu)烧董,數(shù)組的應(yīng)用范圍很廣,而且相對(duì)來(lái)說(shuō)是一種最簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)胧奔。
3.5.2 棧:漢諾塔結(jié)構(gòu)
假設(shè)我們?cè)O(shè)計(jì)一個(gè)層級(jí)頁(yè)面逊移,從頁(yè)面A進(jìn)入B再進(jìn)入C,此時(shí)如果需要返回A的話龙填,我們首先要先返回B胳泉,繼續(xù)進(jìn)行返回操作才能退回到A,這就是一種典型的棧的思路岩遗。
棧又可叫作堆棧扇商,是一種滿足一定規(guī)則的數(shù)據(jù)結(jié)構(gòu),這種規(guī)則通常叫作“后進(jìn)先出”宿礁。
可以把棧理解成一種底部封口案铺,頂部開(kāi)口的容器,數(shù)據(jù)元素可以從開(kāi)口進(jìn)入棧梆靖,這個(gè)過(guò)程我們叫“入椏睾海”,如果要取出棧里面的數(shù)據(jù)元素返吻,則從開(kāi)口取出在上面的數(shù)據(jù)元素姑子,這個(gè)過(guò)程叫“出棧”测僵〗钟樱“棧”的規(guī)則和“漢諾塔”是一樣的捍靠,要想把底部的數(shù)據(jù)元素拿出來(lái)就必須先把前面的數(shù)據(jù)元素全部移出去沐旨。對(duì)棧里的數(shù)據(jù)存取必須按照這種規(guī)則,即出棧的順序與入棧的順序相反剂公。棧的結(jié)構(gòu)如下圖所示希俩。
3.5.3 隊(duì)列:排隊(duì)的藝術(shù)
隊(duì)列和棧一樣吊宋,也是一種操作受一定規(guī)則限制的數(shù)據(jù)結(jié)構(gòu)纲辽。隊(duì)列簡(jiǎn)單理解就是平常生活的排隊(duì)。隊(duì)列在結(jié)構(gòu)上分為隊(duì)頭和隊(duì)尾璃搜,只能在隊(duì)頭執(zhí)行出隊(duì)操作拖吼,在隊(duì)尾執(zhí)行入隊(duì)操作。隊(duì)列實(shí)際上就是一種符合“先進(jìn)先出”規(guī)則的順序集合这吻,隊(duì)列的結(jié)構(gòu)如下圖所示吊档。
隊(duì)列的這種結(jié)構(gòu)在程序中可以控制控制一些事務(wù)性的操作,例如一件事務(wù)包括幾個(gè)步驟唾糯,而且這幾個(gè)步驟有嚴(yán)格的先后順序怠硼,即必須先完成前面的步驟才能進(jìn)行后面的步驟鬼贱。隊(duì)列可以保證一個(gè)操作的原子性和順序性,所以在處理一些事務(wù)性的操作時(shí)常用到隊(duì)列結(jié)構(gòu)香璃。
3.5.4 樹(shù):長(zhǎng)在樹(shù)上的數(shù)據(jù)
樹(shù)也是一種常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)这难,樹(shù)是按照一定規(guī)則進(jìn)行數(shù)據(jù)組織的結(jié)構(gòu)。樹(shù)狀結(jié)構(gòu)上的元素往往叫做一個(gè)節(jié)點(diǎn)葡秒。每個(gè)樹(shù)狀結(jié)構(gòu)都有一個(gè)“根節(jié)點(diǎn)”姻乓,也就是樹(shù)根,從樹(shù)根出發(fā)可以延伸出“枝干節(jié)點(diǎn)”或者叫“兄弟節(jié)點(diǎn)”眯牧,樹(shù)狀結(jié)構(gòu)末端的節(jié)點(diǎn)我們成為“葉子節(jié)點(diǎn)”蹋岩。下圖所示是一種典型的樹(shù)狀結(jié)構(gòu)。
樹(shù)狀結(jié)構(gòu)可以應(yīng)用在產(chǎn)品結(jié)構(gòu)設(shè)計(jì)学少、權(quán)限設(shè)計(jì)及用戶等級(jí)設(shè)計(jì)等場(chǎng)景剪个。樹(shù)狀結(jié)構(gòu)也是程序設(shè)計(jì)中使用比較多的一種數(shù)據(jù)結(jié)構(gòu)。
【案例分析】
“設(shè)計(jì)一個(gè)用戶注冊(cè)的功能版确,用戶注冊(cè)分為兩步禁偎,第一步是設(shè)置用戶登錄賬戶,主要由手機(jī)號(hào)和登錄密碼構(gòu)成阀坏;第二步是完善用戶個(gè)人信息如暖,例如姓名、性別忌堂、愛(ài)好等盒至。用戶注冊(cè)功能在產(chǎn)品設(shè)計(jì)上通過(guò)兩個(gè)界面顯示,第一個(gè)界面進(jìn)行手機(jī)號(hào)碼驗(yàn)證并設(shè)置登錄密碼士修,設(shè)置成功后進(jìn)入第二個(gè)界面完善個(gè)人信息枷遂,個(gè)人信息中的愛(ài)好可以填多個(gè),完成個(gè)人信息設(shè)置后提交成功即可完成注冊(cè)棋嘲,進(jìn)入產(chǎn)品首頁(yè)酒唉。”
上述案例沸移,我們使用了棧結(jié)構(gòu)來(lái)實(shí)現(xiàn)界面的跳轉(zhuǎn)痪伦,從驗(yàn)證手機(jī)號(hào)和設(shè)置登錄密碼的界面進(jìn)入完善個(gè)人信息的界面,再?gòu)耐晟苽€(gè)人信息界面進(jìn)入產(chǎn)品首頁(yè)雹锣,這是一個(gè)典型的棧結(jié)構(gòu)网沾。另外,我們還是用了數(shù)組結(jié)構(gòu)蕊爵,在完善個(gè)人信息步驟中的愛(ài)好填寫(xiě)一欄辉哥,我們可以填寫(xiě)多個(gè)愛(ài)好,愛(ài)好這一數(shù)據(jù)結(jié)構(gòu)可以通過(guò)字符串?dāng)?shù)組表示,每一項(xiàng)愛(ài)好就是數(shù)組中的一項(xiàng)元素醋旦。如果產(chǎn)品首頁(yè)是常規(guī)的底部四個(gè)模塊切換的結(jié)構(gòu)恒水,類似微信底部的四個(gè)模塊,那么這種組合方式就是典型的樹(shù)狀結(jié)構(gòu)饲齐,根節(jié)點(diǎn)控制著四個(gè)子節(jié)點(diǎn)寇窑,每個(gè)子節(jié)點(diǎn)下還可以有很多子節(jié)點(diǎn)。
3.6 ?什么是程序
程序是按照一定的規(guī)則和順序的任務(wù)執(zhí)行過(guò)程箩张,是一套指令集合甩骏,在軟件開(kāi)發(fā)中,程序由數(shù)據(jù)結(jié)構(gòu)和算法組成先慷。在計(jì)算機(jī)中饮笛,我們通過(guò)編程語(yǔ)言表示一段程序,“程序=數(shù)據(jù)結(jié)構(gòu)+算法”我們可以說(shuō)程序由數(shù)據(jù)結(jié)構(gòu)和算法組成论熙,數(shù)據(jù)結(jié)構(gòu)就是我們提到過(guò)的對(duì)數(shù)據(jù)進(jìn)行組織和表示的結(jié)構(gòu)福青,算法是指我們需要完成某一件事情需要處理的步驟。
程序是一套指令集合脓诡,是我們與計(jì)算機(jī)進(jìn)行溝通的工具无午,也就是工程師所說(shuō)的代碼。我們使用編程語(yǔ)言中的數(shù)據(jù)類型表達(dá)數(shù)據(jù)含義祝谚,使用邏輯結(jié)構(gòu)表達(dá)和控制邏輯處理宪迟,通過(guò)數(shù)據(jù)結(jié)構(gòu)組合和呈現(xiàn)數(shù)據(jù),將一套算法用編程語(yǔ)言表達(dá)出來(lái)就構(gòu)成了程序交惯。
3.7? 程序的最小執(zhí)行單元
程序的最小執(zhí)行單元我們稱為函數(shù)或者方法次泽,函數(shù)是完成一項(xiàng)具體任務(wù)的獨(dú)立模塊,函數(shù)的組成包括輸入席爽、輸出及函數(shù)內(nèi)部的處理流程意荤。下面我們定義一個(gè)簡(jiǎn)單的函數(shù),它包括輸入只锻、輸出和內(nèi)部處理流程玖像。
int add (int a,int b) {
int c =a + b
return c;
}
在上面這個(gè)函數(shù)中我們給函數(shù)取了一個(gè)名字叫“add”,然后函數(shù)的返回值類型是整型齐饮,也就是在“add”前面的“int”標(biāo)識(shí)捐寥。函數(shù)名后面的括號(hào)里定義了兩個(gè)變量,叫做函數(shù)的參數(shù)沈矿,參數(shù)就是函數(shù)的輸入值上真,參數(shù)也有數(shù)據(jù)類型咬腋,這里我們定義了兩個(gè)整型的參數(shù)羹膳,分別為變量“a”和“b”。在大括號(hào)內(nèi)部根竿,我們定義了對(duì)這個(gè)函數(shù)的處理流程陵像,完成了輸入?yún)?shù)的相加動(dòng)作就珠。我們定義了一個(gè)變量“c”來(lái)存儲(chǔ)“a+b”的值,然后使用了一個(gè)關(guān)鍵字“return”返回函數(shù)執(zhí)行的結(jié)構(gòu)醒颖。
本章總結(jié):
4.產(chǎn)品經(jīng)理學(xué)數(shù)據(jù)庫(kù)
4.1 ?產(chǎn)品經(jīng)理為什么要學(xué)數(shù)據(jù)庫(kù)
什么是數(shù)據(jù)庫(kù)
我們每天使用互聯(lián)網(wǎng)產(chǎn)品會(huì)產(chǎn)生大量的數(shù)據(jù)礁叔,例如使用微信產(chǎn)生的很多聊天記錄似芝,在微信里發(fā)的朋友圈照片,使用百度搜索的各種內(nèi)容,使用淘寶進(jìn)行購(gòu)物的記錄等步氏,這些數(shù)據(jù)都存儲(chǔ)在數(shù)據(jù)庫(kù)中。
數(shù)據(jù)庫(kù)運(yùn)行在服務(wù)器中氛堕,類似于一個(gè)進(jìn)行數(shù)據(jù)存儲(chǔ)的倉(cāng)庫(kù)枪芒,數(shù)據(jù)按照一定的規(guī)則存儲(chǔ),可以對(duì)數(shù)據(jù)庫(kù)中國(guó)的數(shù)據(jù)進(jìn)行增刪改查的操作挺庞。
我們可以定義數(shù)據(jù)庫(kù)的存儲(chǔ)格式晰赞,例如我們需要存儲(chǔ)微信朋友圈的內(nèi)容,朋友圈的內(nèi)容包括發(fā)送者是誰(shuí)选侨、圖片掖鱼、文字和時(shí)間,這些內(nèi)容格式定義好以后援制,我們就可以將這些存儲(chǔ)格式告訴數(shù)據(jù)庫(kù)戏挡,之后往數(shù)據(jù)庫(kù)里存儲(chǔ)的內(nèi)容就按照這個(gè)格式存儲(chǔ)。對(duì)數(shù)據(jù)庫(kù)的操作不僅僅是往里面存東西晨仑,還可以根據(jù)不同的需求從數(shù)據(jù)庫(kù)里讀取內(nèi)容增拥。同時(shí),我們還可以對(duì)數(shù)據(jù)庫(kù)里的內(nèi)容進(jìn)行修改寻歧。數(shù)據(jù)庫(kù)使我們對(duì)數(shù)據(jù)進(jìn)行集中管理的倉(cāng)庫(kù)掌栅,它通常包括增、刪码泛、改猾封、查這四個(gè)基本操作。數(shù)據(jù)庫(kù)是互聯(lián)網(wǎng)的重要組成部分噪珊,沒(méi)有數(shù)據(jù)庫(kù)晌缘,我們的數(shù)據(jù)就無(wú)法存儲(chǔ),就無(wú)法體驗(yàn)到如今內(nèi)容豐富的互聯(lián)網(wǎng)痢站。
目前數(shù)據(jù)庫(kù)的類型主要是兩種磷箕,關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)。關(guān)系型數(shù)據(jù)庫(kù)是一種應(yīng)用比較廣泛的數(shù)據(jù)庫(kù)阵难,很多產(chǎn)品和系統(tǒng)的后臺(tái)數(shù)據(jù)庫(kù)都是用關(guān)系型數(shù)據(jù)庫(kù)岳枷,例如銀行的交易系統(tǒng)和電商的商品管理系統(tǒng),前文提到的MySQL就是關(guān)系型數(shù)據(jù)庫(kù)的代表。非關(guān)系型數(shù)據(jù)庫(kù)相對(duì)于關(guān)系型數(shù)據(jù)庫(kù)來(lái)說(shuō)空繁,主要在存儲(chǔ)格式和設(shè)計(jì)思想上存在差異殿衰。
4.2 ?關(guān)系型數(shù)據(jù)庫(kù)
關(guān)系型數(shù)據(jù)庫(kù)是一種基于關(guān)系模型的數(shù)據(jù)庫(kù),關(guān)系模型折射現(xiàn)實(shí)世界中的實(shí)體關(guān)系盛泡,將現(xiàn)實(shí)世界中各個(gè)實(shí)體及實(shí)體之間的關(guān)系通過(guò)關(guān)系模型表達(dá)出來(lái)闷祥。例如,人是一個(gè)實(shí)體傲诵,人與人之間有關(guān)系凯砍,這種實(shí)體和關(guān)系間的對(duì)應(yīng)就可以表達(dá)為一個(gè)關(guān)系模型。
現(xiàn)實(shí)世界中我們可以定義很多實(shí)體拴竹,一個(gè)人是一個(gè)實(shí)體果覆,一輛車、一棟房子都可以表達(dá)成一個(gè)實(shí)體殖熟。實(shí)體是一系列屬性的集合局待,人作為一個(gè)實(shí)體有姓名、年齡菱属、性別等基本屬性钳榨,人還可以有職業(yè)、愛(ài)好等附加屬性纽门,這些屬性的集合構(gòu)成人這個(gè)實(shí)體薛耻。與此同時(shí),一個(gè)屬性也可以單獨(dú)成為一個(gè)實(shí)體赏陵。例如饼齿,性別就可以成為一個(gè)單獨(dú)的實(shí)體,這個(gè)實(shí)體里面的屬性包括兩種蝙搔,男和女缕溉。
在人這個(gè)實(shí)體和性別這個(gè)實(shí)體之間存在一個(gè)關(guān)系,一個(gè)人只能有一種性別吃型,所以人和性別這兩個(gè)實(shí)體之間的關(guān)系是一對(duì)一的证鸥。職業(yè)也可以構(gòu)成一個(gè)實(shí)體,職業(yè)的屬性包括工程師勤晚、建筑師枉层、畫(huà)家等很多種,人作為實(shí)體與職業(yè)這個(gè)實(shí)體的關(guān)系是一對(duì)多的赐写,也就是說(shuō)一個(gè)人可以擁有多個(gè)職業(yè)鸟蜡,是建筑師的同時(shí)也可能是畫(huà)家(筆者注:現(xiàn)在這種擁有多重職業(yè)的人喜歡叫自己斜杠青年)。將這種現(xiàn)實(shí)世界中的實(shí)體和關(guān)系通過(guò)關(guān)系模型表達(dá)出來(lái)就可以形成一種數(shù)據(jù)存儲(chǔ)關(guān)系挺邀,通過(guò)這種方式表達(dá)的數(shù)據(jù)庫(kù)就叫做關(guān)系型數(shù)據(jù)庫(kù)揉忘。兩個(gè)實(shí)體關(guān)系之間的聯(lián)系如下圖所示跳座。
實(shí)體A具有三個(gè)屬性,實(shí)體B具有三個(gè)屬性癌淮,他們之間以某一種關(guān)系關(guān)聯(lián)起來(lái)躺坟,這種關(guān)系可以是一對(duì)一的沦补,也可以是一對(duì)多或者多對(duì)多的乳蓄。通過(guò)這種實(shí)體關(guān)系模型我們就可以將現(xiàn)實(shí)世界中的實(shí)物表示成數(shù)據(jù)存儲(chǔ)模型。關(guān)系型數(shù)據(jù)庫(kù)是目前應(yīng)用比較多的一種數(shù)據(jù)庫(kù)模型夕膀,主流的關(guān)系型數(shù)據(jù)庫(kù)有之前提到的MySQL虚倒,另外還有Oracle、DB2等产舞,在智能手機(jī)中使用的小型輕量級(jí)數(shù)據(jù)庫(kù)SQLite也是關(guān)系型數(shù)據(jù)庫(kù)的一種魂奥。
對(duì)產(chǎn)品經(jīng)理來(lái)說(shuō),在產(chǎn)品設(shè)計(jì)階段不需要考慮技術(shù)實(shí)現(xiàn)選用哪種數(shù)據(jù)庫(kù)易猫,這是架構(gòu)師在進(jìn)行技術(shù)選型時(shí)考慮的問(wèn)題耻煤,但在設(shè)計(jì)產(chǎn)品角色和邏輯關(guān)系時(shí),產(chǎn)品經(jīng)理需要明白產(chǎn)品背后的數(shù)據(jù)庫(kù)是如何設(shè)計(jì)的准颓。例如電商產(chǎn)品哈蝇,如果使用關(guān)系型數(shù)據(jù)庫(kù),勢(shì)必有一個(gè)數(shù)據(jù)實(shí)體是專門(mén)用來(lái)存儲(chǔ)商品數(shù)據(jù)的攘已,而且電商類產(chǎn)品有訂單炮赦,訂單在數(shù)據(jù)庫(kù)中也是以一個(gè)實(shí)體的形式存在,商品和訂單這兩個(gè)實(shí)體之間又存在一個(gè)關(guān)聯(lián)關(guān)系样勃,一個(gè)訂單可以包含多個(gè)商品吠勘,一個(gè)商品也可以出現(xiàn)在多個(gè)訂單中,所以訂單實(shí)體和商品實(shí)體之間是多對(duì)多的關(guān)系峡眶。
4.2.1 數(shù)據(jù)庫(kù)表和表的關(guān)系
前面提到了關(guān)系型數(shù)據(jù)庫(kù)中的實(shí)體關(guān)系模型剧防。在關(guān)系型數(shù)據(jù)庫(kù)中可以通過(guò)數(shù)據(jù)庫(kù)表和表之間的關(guān)系來(lái)具象表示這種模型,表就是我們常用的二維表格辫樱,有表的名字诵姜,表的各項(xiàng)標(biāo)題名。例如對(duì)人這個(gè)實(shí)體搏熄,我們可以建立一個(gè)表棚唆,表的名字可以取名為“people”,在表中可以存在屬性心例,例如姓名宵凌、性別、年齡止后、職業(yè)瞎惫、愛(ài)好等溜腐。對(duì)于職業(yè)我們可以新建另一個(gè)表,取名為“profession”瓜喇,表中的屬性可以表示為職業(yè)名稱挺益。需要注意的是,在數(shù)據(jù)庫(kù)中乘寒,表明和屬性名只能用英文命名望众。表與表之間可以通過(guò)關(guān)系來(lái)鏈接,如果兩個(gè)表之間有對(duì)應(yīng)關(guān)系伞辛,在兩個(gè)表中就有對(duì)應(yīng)的屬性項(xiàng)來(lái)表示這個(gè)關(guān)系烂翰。我們來(lái)看一下人和職業(yè)這兩個(gè)表及表之間的關(guān)系,入下圖所示蚤氏。
這兩個(gè)數(shù)據(jù)庫(kù)表對(duì)應(yīng)人這個(gè)實(shí)體的表叫做“people”甘耿,對(duì)應(yīng)職業(yè)這個(gè)實(shí)體的表叫做“profession”,這兩個(gè)表都預(yù)設(shè)了一些屬性竿滨,我們?yōu)檫@些屬性取了對(duì)應(yīng)的名字佳恬。在“people”表中第一個(gè)屬性的名字叫做“peopleId”,這是一個(gè)唯一標(biāo)識(shí)于游,在數(shù)據(jù)庫(kù)表中成為“主鍵”毁葱,標(biāo)識(shí)在數(shù)據(jù)庫(kù)表中的一條唯一數(shù)據(jù),理論上每一個(gè)數(shù)據(jù)庫(kù)表的屬性里面都有一個(gè)用來(lái)做唯一性標(biāo)記的id曙砂,這里我們使用“peopleId”來(lái)唯一標(biāo)記一個(gè)人头谜,即每個(gè)人只會(huì)在該表中出現(xiàn)一次。對(duì)應(yīng)在職業(yè)表“profession”中鸠澈,我們也使用了一個(gè)叫“professionId”的屬性名標(biāo)識(shí)唯一性柱告。在“people”表中有一個(gè)標(biāo)識(shí)職業(yè)的屬性叫做“profession”,通過(guò)這個(gè)屬性可以喝“profession”表產(chǎn)生關(guān)聯(lián)笑陈,可以將所有的職業(yè)信息全部存儲(chǔ)在“profession”表中际度,然后在“people”表中通過(guò)“profession”屬性和“profession”表進(jìn)行關(guān)聯(lián)。下面來(lái)介紹數(shù)據(jù)庫(kù)表之間如何通過(guò)字段進(jìn)行關(guān)聯(lián)涵妥。
4.2.2 數(shù)據(jù)庫(kù)字段和字段類型
在關(guān)系型數(shù)據(jù)庫(kù)中乖菱,我們使用二維表來(lái)表示關(guān)系模型,在二維表中可以使用屬性來(lái)表示某一類數(shù)據(jù)蓬网,屬性在數(shù)據(jù)庫(kù)表中也成為字段窒所。一個(gè)數(shù)據(jù)庫(kù)表有表名,也有字段名帆锋,理論上說(shuō)吵取,一個(gè)數(shù)據(jù)庫(kù)表可以有無(wú)限個(gè)字段,每一個(gè)字段名都不重復(fù)锯厢,且表名和字段名都只能用英文表示皮官。
與編程語(yǔ)言中的數(shù)據(jù)類型一樣脯倒,數(shù)據(jù)庫(kù)表中的字段同樣也有字段類型,在編程語(yǔ)言一章中我們提到常用的數(shù)據(jù)類型有表示整數(shù)的整型捺氢,也有表示字符的字符型藻丢。在數(shù)據(jù)庫(kù)表中,每一個(gè)字段也有自己的數(shù)據(jù)類型摄乒,例如在”people”這個(gè)表中悠反,用于表示姓名的字段“name”可以定義為字符型,用來(lái)表示年齡的字段可以定義為整型缺狠。
為了更簡(jiǎn)潔而且分類更加明確地表達(dá)數(shù)據(jù)庫(kù)表问慎,我們可以通過(guò)關(guān)聯(lián)關(guān)系將不同的實(shí)體進(jìn)行連接萍摊,例如前問(wèn)我們與人相關(guān)的職業(yè)單獨(dú)定義成一個(gè)實(shí)體挤茄,在“profession”表中我們可以為每一個(gè)職業(yè)分配一個(gè)“id”,也就是主鍵冰木,然后在“people”表中通過(guò)關(guān)聯(lián)對(duì)應(yīng)的“id”實(shí)現(xiàn)實(shí)體間的關(guān)聯(lián)穷劈,如下圖所示。
我們?cè)凇?.2.1 數(shù)據(jù)庫(kù)表和表的關(guān)系】中配圖的基礎(chǔ)上添加了每一個(gè)字段的數(shù)據(jù)類型踊沸,然后將“people”表中的“profession”字段與“profession”表中的“professionId”字段關(guān)聯(lián)起來(lái)歇终。通過(guò)這種關(guān)聯(lián),兩個(gè)表就產(chǎn)生了一個(gè)關(guān)聯(lián)逼龟,接下來(lái)我們看具體的數(shù)據(jù)如何在數(shù)據(jù)庫(kù)表里進(jìn)行存儲(chǔ)评凝,以及關(guān)聯(lián)關(guān)系是如何表示的,如下圖所示
典型的關(guān)系型數(shù)據(jù)庫(kù)表結(jié)構(gòu)實(shí)際上就是一個(gè)二維表腺律,我們通過(guò)“peopleId”來(lái)唯一標(biāo)識(shí)一個(gè)具體的人奕短,然后存儲(chǔ)了包括姓名、性別匀钧、年齡和職業(yè)等信息翎碑。職業(yè)信息我們使用了另一個(gè)表來(lái)存儲(chǔ),然后通過(guò)關(guān)聯(lián)兩個(gè)表的對(duì)應(yīng)字段進(jìn)行聯(lián)系之斯∪砧荆可以看到在“people”表中的字段“profession”我們存儲(chǔ)的數(shù)據(jù)是整型數(shù)據(jù)1,對(duì)應(yīng)在“profession”表中也有一個(gè)整形字段“professionId”佑刷,對(duì)應(yīng)值是1莉擒,而且代表的職業(yè)名稱是“professionName”對(duì)應(yīng)的建筑師,從中可知張三的職業(yè)是建筑師瘫絮。我們可以單獨(dú)維護(hù)一個(gè)職業(yè)信息表涨冀,如果有新增的職業(yè)只需往“profession”表中添加數(shù)據(jù),在“people”表中通過(guò)引用“profession”表的字段來(lái)表示職業(yè)檀何。
數(shù)據(jù)庫(kù)表字段的確定和表關(guān)系的設(shè)計(jì)在設(shè)計(jì)數(shù)據(jù)庫(kù)初期就需要確定蝇裤,設(shè)計(jì)一個(gè)完整且兼容性強(qiáng)的數(shù)據(jù)庫(kù)需要非常豐富的經(jīng)驗(yàn)及對(duì)產(chǎn)品需求的充分理解廷支。
4.2.3 數(shù)據(jù)庫(kù)操作語(yǔ)言(SQL)
SQL(Structured Query Language)即結(jié)構(gòu)化查詢語(yǔ)言,是一種用來(lái)操作關(guān)系型數(shù)據(jù)庫(kù)的編程語(yǔ)言栓辜,可以理解為對(duì)數(shù)據(jù)庫(kù)的操作命令恋拍。我們可以使用SQL對(duì)數(shù)據(jù)庫(kù)進(jìn)行各種操作,包括創(chuàng)建數(shù)據(jù)庫(kù)表藕甩,為某一個(gè)數(shù)據(jù)庫(kù)表添加數(shù)據(jù)施敢,或者對(duì)數(shù)據(jù)進(jìn)行修改、刪除及查詢操作等狭莱。SQL和編程語(yǔ)言一樣僵娃,也有固定的語(yǔ)法結(jié)構(gòu),我們可以用對(duì)應(yīng)的語(yǔ)句對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作腋妙。下圖所示是數(shù)據(jù)庫(kù)操作員通過(guò)SQL語(yǔ)句操作數(shù)據(jù)庫(kù)然后獲取操作結(jié)果的流程圖默怨。
由于筆者最近恰巧在學(xué)習(xí)SQL語(yǔ)句,關(guān)于SQL的學(xué)習(xí)筆記之后也會(huì)在簡(jiǎn)書(shū)更新??
4.3 ?非關(guān)系型數(shù)據(jù)庫(kù)
與關(guān)系型數(shù)據(jù)庫(kù)相比骤素,非關(guān)系型數(shù)據(jù)庫(kù)是一種相對(duì)松散且可以不按照嚴(yán)格的結(jié)構(gòu)規(guī)范進(jìn)行存儲(chǔ)的數(shù)據(jù)庫(kù)匙睹。非關(guān)系型數(shù)據(jù)庫(kù)一般叫做NoSQL(Not Only SQL),非關(guān)系型數(shù)據(jù)庫(kù)沒(méi)有關(guān)系型數(shù)據(jù)庫(kù)那樣嚴(yán)格的數(shù)據(jù)結(jié)構(gòu)約束济竹,在存儲(chǔ)的形式和使用上有別于關(guān)系型數(shù)據(jù)庫(kù)痕檬。現(xiàn)在主流的非關(guān)系型數(shù)據(jù)庫(kù)有MongoDB和CouchDB。以MongoDB為例送浊,它的數(shù)據(jù)以類似文檔的方式進(jìn)行存儲(chǔ)梦谜,每一個(gè)文檔都有對(duì)應(yīng)的唯一標(biāo)識(shí)和版本號(hào)。
在關(guān)系型數(shù)據(jù)庫(kù)中袭景,我們使用二維表和字段來(lái)規(guī)范數(shù)據(jù)存儲(chǔ)唁桩,但在非關(guān)系型數(shù)據(jù)庫(kù)中,我們可以按照更靈活的方式定義數(shù)據(jù)存儲(chǔ)浴讯。在非關(guān)系型數(shù)據(jù)庫(kù)MongoDB中朵夏,我們可以使用鍵值對(duì)的方式表示和存儲(chǔ)數(shù)據(jù),鍵值對(duì)就是“key-value”的形式榆纽,類似在關(guān)系型數(shù)據(jù)庫(kù)表中的字段名和該字段名對(duì)應(yīng)的值仰猖。在MongoDB中,使用JSON格式的數(shù)據(jù)進(jìn)行數(shù)據(jù)表示和存儲(chǔ)奈籽,例如我們表示“people”這一數(shù)據(jù)結(jié)構(gòu)可以使用如下方式饥侵。
{
“peopleId”: “001”
“name”: “張三”
“sex”: “男
“age”: “28”
“profession”: “建筑師"
}
上述就是一種JSON結(jié)構(gòu),一共有5個(gè)數(shù)據(jù)在這個(gè)JSON結(jié)構(gòu)中衣屏,它們以“key-value”的形式存儲(chǔ)躏升,冒號(hào)左邊的是“key”,冒號(hào)右邊的是“value”狼忱,基于這個(gè)結(jié)構(gòu)我們可以無(wú)限擴(kuò)展其他的鍵值對(duì)膨疏,而且鍵值對(duì)可以進(jìn)行嵌套一睁,例如下面這種結(jié)構(gòu)。
{
“peopleId”: “001”
“name”: “張三”
“sex”: “男
“age”: “28”
“profession”: “id”:{“1”佃却,“professionName”:“建筑師”}
}
在上面這種結(jié)構(gòu)中者吁,鍵“profession”對(duì)應(yīng)的值也是一個(gè)JSON結(jié)構(gòu),通過(guò)這種嵌套的方式可以很靈活地?cái)U(kuò)展數(shù)據(jù)表示饲帅,數(shù)據(jù)存儲(chǔ)方式也更靈活复凳。
非關(guān)系型數(shù)據(jù)庫(kù)適用場(chǎng)景:一些對(duì)存取要求比較高并且并發(fā)處理比較高的場(chǎng)合,例如對(duì)網(wǎng)站訪問(wèn)數(shù)據(jù)的統(tǒng)計(jì)灶泵。
非關(guān)系型數(shù)據(jù)庫(kù)處在不斷發(fā)展的過(guò)程中育八,現(xiàn)階段與關(guān)系型數(shù)據(jù)庫(kù)形成一種互補(bǔ)的局勢(shì),在很多產(chǎn)品后臺(tái)赦邻,同時(shí)使用關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)髓棋。
本章總結(jié):
后續(xù)章節(jié)還會(huì)持續(xù)更新,敬請(qǐng)關(guān)注深纲。