本系列適合沒有技術(shù)背景的菜鳥看密似,是我閱讀唐韌老師的《產(chǎn)品經(jīng)理必懂的技術(shù)那些事兒》的筆記焙矛,歡迎產(chǎn)品菜鳥們一起交流~
第二篇是數(shù)據(jù)庫,包含數(shù)據(jù)庫概述残腌、關(guān)系型與非關(guān)系型數(shù)據(jù)庫介紹
1. 數(shù)據(jù)庫基礎(chǔ)
1.1 定義
數(shù)據(jù)庫類似于一個(gè)數(shù)據(jù)存儲(chǔ)的倉庫村斟,按照一定的規(guī)則存儲(chǔ),可以進(jìn)行增刪改查操作抛猫。
1.2 分類
分為關(guān)系型數(shù)據(jù)庫(MySQL為代表)與非關(guān)系型數(shù)據(jù)庫(MongoDB和CouchDB為代表)邓梅。
區(qū)別:關(guān)系型數(shù)據(jù)庫基于關(guān)系模型,折射現(xiàn)實(shí)世界中的實(shí)體關(guān)系邑滨。
非關(guān)系型數(shù)據(jù)庫以相對(duì)松散的方式存儲(chǔ)數(shù)據(jù)日缨,不像關(guān)系型數(shù)據(jù)庫有嚴(yán)格的數(shù)據(jù)結(jié)構(gòu)約束。
1.3 基本操作
對(duì)數(shù)據(jù)庫可進(jìn)行增掖看、刪匣距、改、查的操作哎壳。
2. 關(guān)系型數(shù)據(jù)庫
2.1 定義
關(guān)系型數(shù)據(jù)庫是基于關(guān)系模型的數(shù)據(jù)庫毅待,關(guān)系模型折射現(xiàn)實(shí)生活中的實(shí)體關(guān)系,通過實(shí)體關(guān)系模型的方式表現(xiàn)出來归榕。
實(shí)體關(guān)系模型:現(xiàn)實(shí)生活中尸红,人是一個(gè)實(shí)體、車是一個(gè)實(shí)體刹泄,人跟人之間會(huì)有關(guān)系外里,人跟車也會(huì)有關(guān)系。
實(shí)體:一系列屬性的結(jié)合特石,比如人這個(gè)實(shí)體就有職業(yè)盅蝗、年齡、性別的屬性姆蘸。屬性也可以成為一個(gè)實(shí)體墩莫,比如職業(yè)芙委、性別都可以單獨(dú)成為一個(gè)實(shí)體。
實(shí)體關(guān)系:一對(duì)一(1:1)狂秦、一對(duì)多(1:N)灌侣、多對(duì)多(M:N)。
比如在電商中如果用關(guān)系型數(shù)據(jù)庫裂问,實(shí)體就包括商品顶瞳、訂單,之間有多對(duì)多的關(guān)聯(lián)關(guān)系愕秫。
實(shí)體模型再往下具象,在數(shù)據(jù)庫中實(shí)際表現(xiàn)為數(shù)據(jù)庫表和表之間的關(guān)系焰络。
2.2 數(shù)據(jù)庫表和表的關(guān)系
數(shù)據(jù)庫表與實(shí)體模型的對(duì)應(yīng)關(guān)系:實(shí)體→表戴甩,屬性→字段,實(shí)體關(guān)系→數(shù)據(jù)表關(guān)系
定義規(guī)則:在定義表的時(shí)候需要定義表名闪彼、字段名甜孤、字段類型。表名和屬性名只能用英文命名畏腕。
字段類型:與數(shù)據(jù)類型一致缴川,分為整型、字符型等描馅。
主鍵:表中第一個(gè)屬性的名字叫做 表名+id 把夸,作為表中數(shù)據(jù)的唯一性標(biāo)記。例如“人”的表铭污,主鍵就是peopleid恋日,1號(hào)、2號(hào)……每個(gè)peopleid都唯一對(duì)應(yīng)表中的一個(gè)人嘹狞。
關(guān)聯(lián)方法:通過關(guān)聯(lián)對(duì)應(yīng)的主鍵實(shí)現(xiàn)實(shí)體/表之間的關(guān)聯(lián)岂膳。如圖就是在people中關(guān)聯(lián)了professionId。
2.3 數(shù)據(jù)庫操作語言(SQL)
SQL語句:用來操作關(guān)系型數(shù)據(jù)庫的操作命令
示例:
建表:create table people (peopleId varchar(30) primary key, name varchar (50)) ? ?
建表包含peopleId與name兩個(gè)字段磅网,并通過primary key指定peopleId為主鍵谈截,varchar (30) 表示字符型最大長度30字符
已建表中插入數(shù)據(jù):
insert into people values('001','張三')
往people表中插入了值"001"張三”,按順序?qū)?yīng)到表中字段
對(duì)數(shù)據(jù)進(jìn)行修改:
update people set name=‘李四’ where peopleId= '001'
更新people表中peopleId為001的這條數(shù)據(jù)涧偷,把名字改為李四
查詢數(shù)據(jù):
select * from people 查詢表中所有的數(shù)據(jù)
select peopleId,name from people 查詢表中的peopleId和name兩個(gè)字段的數(shù)據(jù)
select * from people where peopleId='001' 查詢表中peopleId為001的這條數(shù)據(jù)的所有字段
select * from people where age > 20 查詢people表中年齡大于20歲的人
3.非關(guān)系型數(shù)據(jù)庫NoSQL(Not Only SQL)
3.1 定義
松散的不按照嚴(yán)格的結(jié)構(gòu)規(guī)范進(jìn)行存儲(chǔ)的數(shù)據(jù)庫簸喂。
適合場合:對(duì)存取要求比較高且并發(fā)處理比較高的場合,例如對(duì)網(wǎng)站訪問數(shù)據(jù)的統(tǒng)計(jì)燎潮。
3.2 四大分類:
鍵值對(duì)(key-value)存儲(chǔ)數(shù)據(jù)庫(如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB)娘赴、列存儲(chǔ)數(shù)據(jù)庫(如:Cassandra, HBase, Riak)、文檔型數(shù)據(jù)庫(CouchDB, MongoDb)跟啤、圖形數(shù)據(jù)庫(Neo4J, InfoGrid, Infinite Graph)诽表。其中文檔型數(shù)據(jù)庫是比較主流的唉锌。
3.3 以MongoDb為例
數(shù)據(jù)以類似文檔的方式進(jìn)行存儲(chǔ),每個(gè)文檔都有唯一標(biāo)識(shí)和版本號(hào)竿奏。以鍵值對(duì)(key-value)的方式表示和存儲(chǔ)數(shù)據(jù)袄简。據(jù),使用JSON格式的數(shù)據(jù)進(jìn)行表示和存儲(chǔ)泛啸。
{
"peopleId": "001",
"name": "張三",
"sex": "male",
"age": "28",
"profession": "建筑師”
}
這就存儲(chǔ)了5個(gè)“key-value”形式的數(shù)據(jù)绿语,冒號(hào)左邊的是key、右邊的是value候址。
鍵值對(duì)的嵌套:
[
"id": "001"
"name": "張三”
"profession": {"id: "1", "professionName": "建筑師“”}
}
鍵profession的值也是一個(gè)JSON結(jié)構(gòu)吕粹。
4.實(shí)際工作建議
在設(shè)計(jì)功能時(shí),工程師常常會(huì)提出跟數(shù)據(jù)庫相關(guān)的問題岗仑,如新功能影響到現(xiàn)有數(shù)據(jù)庫的設(shè)計(jì)匹耕、有些字段是目前數(shù)據(jù)庫里沒有的、這個(gè)功能導(dǎo)致了數(shù)據(jù)庫結(jié)構(gòu)的變化荠雕。所以要求我們?cè)趯?duì)已有功能修改時(shí)注意兩個(gè)問題:
一是新的設(shè)計(jì)應(yīng)該對(duì)數(shù)據(jù)庫做何種調(diào)整稳其,是新增數(shù)據(jù)庫字段還是要修改或刪除原有字段
二是新設(shè)計(jì)對(duì)原有數(shù)據(jù)的兼容性問題
在溝通時(shí)工程師常常根據(jù)字段的名字來說明問題,產(chǎn)品需要知道字段是代表哪個(gè)產(chǎn)品功能中的哪一個(gè)具體信息炸卑。