技多不壓身 | 產(chǎn)品經(jīng)理需知的那些數(shù)據(jù)庫基礎(chǔ)知識

10 評論 13501 瀏覽 198 收藏 26 分鐘

技多不壓身,無論是什么數(shù)據(jù)產(chǎn)品經(jīng)理還是其他品類的產(chǎn)品經(jīng)理,都需要懂點數(shù)據(jù)庫知識。懂技術(shù)能讓你在跟開發(fā)撕逼中多了一個資本。

隨著近幾年AI智能,大數(shù)據(jù)的發(fā)展,“產(chǎn)品經(jīng)理是是否需要懂技術(shù)?”“產(chǎn)品經(jīng)理應(yīng)該對技術(shù)理解到什么程度?”諸如此類的問題又再次出現(xiàn)在許多人的視野中,或者說它就未曾離開過。

筆者認為,這要具體放到某個具體業(yè)務(wù)場景或者行業(yè)下去分析,例如:作為一名數(shù)據(jù)產(chǎn)品經(jīng)理,你可能需要懂一些數(shù)據(jù)庫,大數(shù)據(jù)的相關(guān)知識;作為一名AI語音產(chǎn)品經(jīng)理,你可能需要懂一些關(guān)于自然語言處理(NLP)的相關(guān)技術(shù)。

當然,技多不壓身,懂技術(shù)能讓你在跟開發(fā)撕逼中多了一個資本。

在進入正文之前,我們先來思考幾個小問題:

    1. 當你在一個APP或者網(wǎng)站注冊賬戶時,你填寫的信息保存在哪里?
    2. 當你嘗試登陸和平精英準備吃雞時,APP怎么知道是你,并提供差異化服務(wù)?
    3. 當你修改一個賬號的密碼時,為什么可以用馬上新密碼登陸了?
  1. 當你在一個APP或者網(wǎng)站注銷賬號時,請問你的賬戶信息如何變化?

這四個問題看起來很簡單,但深究起來,它對應(yīng)著數(shù)據(jù)庫的四個基本操作CRUD:即增加(Create)、讀取查詢(Retrieve)、更新(Update)和刪除(Delete)。

何為數(shù)據(jù)庫?

百度百科對數(shù)據(jù)庫給出以下定義:

所謂“數(shù)據(jù)庫”是以一定方式儲存在一起、能予多個用戶共享、具有盡可能小的冗余度、與應(yīng)用程序彼此獨立的數(shù)據(jù)集合。

數(shù)據(jù)庫可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數(shù)據(jù)進行新增、查詢、更新、刪除等操作。

簡單的理解:數(shù)據(jù)庫(DataBase,簡稱DB)是用于保存有組織的數(shù)據(jù)的容器。

在DB中,數(shù)據(jù)通常以一種結(jié)構(gòu)化的文件——表,作為其展現(xiàn)形式。對DB的操作可以看做是對DB中表的操作,而對DB中表的操作可以類比為對Excel中表的操作。

數(shù)據(jù)庫中的表有行和列的概念,符合我們的常規(guī)認知。

列是表中的一個字段,存儲著相同屬性的數(shù)據(jù),例如:一列專門來存儲用戶的賬號昵稱。

行是表中的一個記錄,可用于存儲某一個用戶的完整信息,例如:用戶A,男,22歲,身高170cm,體重120斤。

表中的某一列(或一組列)我們稱為主鍵,其值可以用來唯一區(qū)分表中每個行(或者說每條記錄)。說白了,主鍵就是用來唯一代表某條記錄(某行)的。

主鍵需滿足以下條件:

  1. 任意兩行都不具有相同的主鍵值。
  2. 每個行都必須具有一個主鍵值,即主鍵不允許設(shè)置為Null的值。

舉個例子:在學生管理系統(tǒng)中,我們用學號來唯一代表每個學生,此時學號所在的那一列就是主鍵。

那么,如何理解某一組列作為主鍵呢?

當我們無法用單獨的某一列來代表一條記錄時,我們就要采用某兩列或者某幾列來共同代表一條記錄。

例如:一個表格記錄著一個班級的學生,不同課程的不同考試中的數(shù)據(jù)時,你想從中找出學生A,每一次考試中的語文成績時,就需要以學號和課程名稱這兩列來作為復合主鍵。

DBMS與SQL?

一般情況下,我們不會去直接操作數(shù)據(jù)庫,往往是通過數(shù)據(jù)庫管理系統(tǒng)(Database Management System,簡稱DBMS)去對數(shù)據(jù)庫進行統(tǒng)一的管理和控制,以保證數(shù)據(jù)庫的安全性和完整性。

典型的DBMS包括例如:MySQL,Oracle,mongoDB,Redis等等。

這里注意一點:在平時交流的時候,許多人會直接將MySQL,Oracle等稱作是數(shù)據(jù)庫,很多網(wǎng)上的資料也是這么寫的。但從嚴格意義上來講,MySQL,Oracle應(yīng)該是數(shù)據(jù)庫管理系統(tǒng)。

為了方便大家跟網(wǎng)上的資料能夠共同理解,筆者在此暫時稱呼MySQL為數(shù)據(jù)庫。

目前主流數(shù)據(jù)庫基本分為兩類:關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫。

關(guān)系型數(shù)據(jù)庫是指采用了關(guān)系模型來組織數(shù)據(jù)的數(shù)據(jù)庫。其最典型的數(shù)據(jù)結(jié)構(gòu)是表,結(jié)構(gòu)相對固定,格式一致,易于維護。但是靈活性不強,讀寫性能比較差,尤其是在海量數(shù)據(jù)的處理上,效率不高。

非關(guān)系型數(shù)據(jù)庫狹義上講并不是一種數(shù)據(jù)庫,而是一種數(shù)據(jù)結(jié)構(gòu)化存儲方法的集合。因為大多數(shù)經(jīng)典的關(guān)系型數(shù)據(jù)庫命名都為“***SQL”,為了做出區(qū)分,行業(yè)內(nèi)通常將非關(guān)系型數(shù)據(jù)庫統(tǒng)稱為NoSQL。NoSQL格式靈活,可以很好的滿足高并發(fā)讀寫需求,成本低,速度快。

在安裝完MySQL之后,他會幫我們順帶安裝數(shù)據(jù)庫。我們就可以直接通過MySQL的命令窗口啟動服務(wù),并對數(shù)據(jù)庫進行操作。

例如在下圖中,筆者在win10系統(tǒng)中,先以管理員權(quán)限打開PowerShell,然后啟動MySQL命令窗口,再通過“create database test;”創(chuàng)建一個名稱為test的數(shù)據(jù)庫。(一般情況下,不建議用root登陸)

這種操作方式對于非技術(shù)人員來講,并不是十分友好。因此在日常使用中,我會采用MySQL+Navicat來實現(xiàn)對數(shù)據(jù)庫的操作。

Navicat是一套多連接數(shù)據(jù)庫開發(fā)工具,工具中帶有靈活的數(shù)據(jù)庫圖形可視化界面,方便用戶直接進行類如Excel的表格操作,由此來實現(xiàn)最終的數(shù)據(jù)庫操作。

SQL(Structured Query Language)是結(jié)構(gòu)化查詢語言,可以用來和數(shù)據(jù)庫通信,絕大部分DBMS都支持SQL,簡單的說就是通過編寫SQL語句來操作數(shù)據(jù)庫。

在下面的操作中,筆者也將以MySQL+Navicat作為基礎(chǔ)開發(fā)環(huán)境,以SQL語法為說明。

實戰(zhàn)演練

對數(shù)據(jù)庫DB,數(shù)據(jù)庫管理系統(tǒng)DBMS,結(jié)構(gòu)化查詢語言SQL有所了解后,讓我們繼續(xù)回到開篇講的四個問題。

  1. 當你在一個APP或者網(wǎng)站注冊賬戶時,你填寫的信息保存在哪里?
  2. 當你嘗試登陸和平精英準備吃雞時,APP怎么知道是你,并提供差異化服務(wù)?
  3. 當你修改一個賬號的密碼時,為什么可以用馬上新密碼登陸了?
  4. 當你在一個APP或者網(wǎng)站注銷賬號時,請問你的賬戶信息如何變化?

將這四個步驟拼接在一起,可以得出一個最簡單的用戶賬戶注冊、登錄、修改、注銷的流程。

這四部分對應(yīng)到數(shù)據(jù)庫的相關(guān)操作就是增加(Create)、讀取查詢(Retrieve)、更新(Update)和刪除(Delete)。

1. 事前準備

我們先在Navicat中跟一個已存在的數(shù)據(jù)庫進行連接,然后建立一張名為user_test的表,表中分別有字段:ID(作為主鍵)、account(賬戶名)、password(密碼)、source(注冊來源)、name(真實姓名)、age(年齡)、job(職業(yè))。

2. 注冊步驟及其SQL

在用戶注冊時,會在注冊界面填寫相應(yīng)的信息,點擊頁面底部的注冊按鍵,系統(tǒng)將執(zhí)行數(shù)據(jù)庫記錄插入操作,其通用SQL語法為:

  • 其中INSERT INTO表示插入動作,大小寫都可以,標準寫法為大寫。
  • 其中table_name為表名,指你所要操作的表,一般為小寫。
  • 其中field1, field2,…fieldN為對應(yīng)的字段名,一般字段命名為小寫或駝峰式。
  • 其中value1, value2,…valueN為每個字段對應(yīng)的值,寫入值需符合字段定義的數(shù)據(jù)類型。

最后,所有SQL語法中都以 “;”作為語句結(jié)尾,這個不要漏了。

在本例中,對應(yīng)的SQL為:

經(jīng)過插入操作后,數(shù)據(jù)庫中表的結(jié)果為

在這里,因為我們的表中的ID字段設(shè)置為主鍵,并且由數(shù)據(jù)庫進行自增操作,所以我們不會對其進行額外操作。

3. 登陸步驟及其SQL

假設(shè)當前數(shù)據(jù)庫中user_test表的數(shù)據(jù)如下:

在用戶登錄時,系統(tǒng)會根據(jù)用戶輸入的賬戶名去數(shù)據(jù)庫中檢索,如果沒有查詢到相應(yīng)的賬戶名,則提示賬戶不存在;如果查詢到賬戶名,則再根據(jù)數(shù)據(jù)庫中該賬戶名的密碼去跟用戶登錄時輸入的密碼進行匹配,如果匹配失敗,則提示密碼輸入錯誤,反之登陸成功。

所以在這個步驟中,執(zhí)行的是數(shù)據(jù)庫的查詢操作,其通用的SQL語句為:

  • 其中SELECT代表查詢操作,一般用大寫。
  • 其中column_name,column_name…表示你要查詢的列名,跟表中的列名要保持一致。
  • 其中table_name代表你所要查詢的表。
  • 其中[WHERE Clause]表示你要查詢這張表時,所約束的條件。

在本例中,假設(shè)是RD李四登陸,則根據(jù)李四的賬戶名“用戶2”查詢其密碼,年齡,注冊來源,職業(yè),姓名這幾個字段信息的SQL為:

經(jīng)過查詢操作后,得出的查詢結(jié)果為:

4. 更新步驟及其SQL

假設(shè)當前數(shù)據(jù)庫中user_test表的數(shù)據(jù)如下:

在用戶登錄成功后,可以對密碼進行更改,系統(tǒng)根據(jù)當前登陸賬戶,將舊密碼更改為新密碼。

所以在這個步驟中,執(zhí)行的是數(shù)據(jù)庫的更新操作,其通用的SQL語句為:

  • 其中UPDATE代表更新操作,一般用大寫。
  • 其中table_name代表你所要操作的表。
  • 其中field1,field2代表你要更新的字段,需要跟你表格中定義的字段名一致。
  • 其中new-value1,new-value2代表更新字段的值,寫入值需要與定義的數(shù)據(jù)類型一致。

其中[WHERE Clause]表示你要更新這張表時,所約束的條件。在這里注意一點,進行UPDATE操作時,一定要跟上[WHERE Clause],不然將會把整張表的數(shù)據(jù)更新。

在本例中,假設(shè)我們要對QA王五的密碼和職業(yè)進行更新,則SQL為:

經(jīng)過更新操作后,數(shù)據(jù)庫中表的結(jié)果變?yōu)椋?/p>

5. 注銷步驟及其SQL

假設(shè)當前數(shù)據(jù)庫中user_test表的數(shù)據(jù)如下:

當用戶試圖注銷自己的賬號時,系統(tǒng)會根據(jù)相應(yīng)的賬戶名對用戶的信息進行刪除。至于刪除哪些信息,取決于業(yè)務(wù)要求。有些應(yīng)用會將用戶信息全部刪除,有些則會保留一些基礎(chǔ)信息,方便用戶二次注冊的時候,可以快速完成。

所以,在這個步驟執(zhí)行的是數(shù)據(jù)庫的刪除操作,其通用的SQL為:

  • 其中DELETE表示刪除操作。
  • 其中table_name表示你要操作的表格。
  • 其中[WHERE Clause]表示你要刪除某條記錄時,所約束的條件。在這里注意一點,進行DELETE操作時,一定要跟上[WHERE Clause],不然將會把整張表的數(shù)據(jù)刪除,數(shù)據(jù)庫數(shù)據(jù)一旦刪除,是不可恢復的,切記!

在本例中,假設(shè)我們要將RD李四的賬戶注銷,并且刪除其所有數(shù)據(jù),則SQL為:

創(chuàng)新型數(shù)據(jù)庫

1. 時序數(shù)據(jù)庫

時序數(shù)據(jù)庫(Time Series Database,簡稱TSDB)是非關(guān)系型數(shù)據(jù)庫中的一種,也是很重要的一種。

隨著目前AI智能的發(fā)展,在很多場景下,特別是將來的工業(yè)互聯(lián)網(wǎng)中,我們需要收集海量的過去式數(shù)據(jù),借此來分析和預測將來可能發(fā)生的事情。例如:金融交易股票走勢,物聯(lián)網(wǎng)傳感器設(shè)備的測量數(shù)據(jù),氣溫或日濕度預測等等。

以股票走勢預測為例,單靠目前股票的位點是無法分析的,只有結(jié)合股票在前十分鐘,前一個小時,甚至前幾天的走勢,才能更加精準的預測出未來某一時刻的具體情況。

時序數(shù)據(jù)庫就是專門用來存儲海量時序數(shù)據(jù)的。而時序數(shù)據(jù)就是基于時間的一系列數(shù)據(jù)。

簡單地可以理解成,它以時間為主坐標軸,以需要被記錄的數(shù)據(jù)作為縱軸,通過規(guī)則的時間間隔或者是不規(guī)則的時間間隔去表征一系列數(shù)據(jù)的規(guī)律性或異常性變化。

時序數(shù)據(jù)庫包含以下幾個基礎(chǔ)部分:

  1. Metric: 度量,相當于關(guān)系型數(shù)據(jù)庫中的table。
  2. Data point: 數(shù)據(jù)點,相當于關(guān)系型數(shù)據(jù)庫中的row。
  3. Timestamp:時間戳,代表數(shù)據(jù)點產(chǎn)生的時間。
  4. Field:度量下的不同字段。比如位置這個度量具有經(jīng)度和緯度兩個field。一般情況下存放的是會隨著時間戳的變化而變化的數(shù)據(jù)。
  5. Tag:標簽,或者附加信息。一般存放的是并不隨著時間戳變化的屬性信息。timestamp加上所有的tags可以認為是table的主鍵。

有的小伙伴可能會說,直接在一般的數(shù)據(jù)庫中,加入一個代表時間的列,不就可以完成嗎。在數(shù)據(jù)比較少,數(shù)據(jù)庫操作不頻繁的時候,這種方法還是可以的。

隨著數(shù)據(jù)存儲量的增多,如果想要達到跟時序數(shù)據(jù)庫一樣的效果,那就會頻繁的操作數(shù)據(jù)庫,這會造成極大的開銷,從而極大的降低讀寫速度。

總的來說,時序數(shù)據(jù)庫具有大規(guī)模數(shù)據(jù)支持,多精度數(shù)據(jù)存儲,多標簽數(shù)據(jù)查詢等特點。

2. 圖數(shù)據(jù)庫

非關(guān)系型數(shù)據(jù)庫NoSQL大致可以分為四類:

  1. 鍵值(key-value)數(shù)據(jù)庫
  2. 圖數(shù)據(jù)庫
  3. 列存儲數(shù)據(jù)庫
  4. 文檔型數(shù)據(jù)庫

圖數(shù)據(jù)庫就是NoSQL其中的一種,它以圖這種數(shù)據(jù)結(jié)構(gòu)存儲和查詢數(shù)據(jù)。圖由兩個主要元素組成:節(jié)點和關(guān)系。

節(jié)點代表一個實體(時間,地點,人或其他數(shù)據(jù)),關(guān)系則代表兩個節(jié)點之間的關(guān)聯(lián)方式。

相比于NoSQL中的其他類型數(shù)據(jù)庫而言,圖數(shù)據(jù)庫具有更加豐富的模型表現(xiàn)能力和更加高效的索引。

在實際應(yīng)用中,業(yè)務(wù)邏輯往往十分復雜,如果用關(guān)系型數(shù)據(jù)庫來表示各個實體之間的潛在關(guān)系,則需要建立十分多的關(guān)聯(lián)表。數(shù)據(jù)庫需要通過關(guān)聯(lián)表間接地維護實體間的關(guān)系,導致數(shù)據(jù)庫的執(zhí)行效能低下,同時也會引起關(guān)聯(lián)表的數(shù)量急劇上升。

例如:在一個訂單系統(tǒng)中,要清楚表現(xiàn)出用戶、訂單、商品之間的邏輯關(guān)系,需要建立四張關(guān)聯(lián)表,這顯得十分復雜,開發(fā)效率也很低。

而在圖數(shù)據(jù)庫中,我們只需要建立四個節(jié)點,并用關(guān)系來表示節(jié)點之間的邏輯,最后用任意兩個節(jié)點之間的關(guān)系去索引,即可提升效率。隨著業(yè)務(wù)邏輯性愈發(fā)的復雜,數(shù)據(jù)量的增多,關(guān)聯(lián)表數(shù)量會急劇上升,這時圖數(shù)據(jù)庫的優(yōu)勢愈發(fā)明顯。

小結(jié)

隨著大數(shù)據(jù),AI智能的發(fā)展,為解決不同業(yè)務(wù)需求,越來越多的創(chuàng)新數(shù)據(jù)庫隨之出現(xiàn),時序數(shù)據(jù)庫和圖數(shù)據(jù)庫就是其中之一。時序數(shù)據(jù)庫解決了時間序列數(shù)據(jù)存儲,索引的問題;圖數(shù)據(jù)庫則解決了復雜邏輯下,各個實體之間相互表征,索引的問題。

數(shù)據(jù)庫攻擊及防護

對于每個應(yīng)用而言,數(shù)據(jù)庫為其提供了前后臺數(shù)據(jù)交互的作用。對于企業(yè)而言,數(shù)據(jù)庫存儲了海量的用戶數(shù)據(jù),一旦數(shù)據(jù)庫被攻擊或被破壞,將會導致用戶信息泄露,進而導致一系列無法彌補的損失。因而,數(shù)據(jù)庫的保護工作極其重要,特別是一些涉及金融,政府層面的數(shù)據(jù)。

在云計算領(lǐng)域中,數(shù)據(jù)庫還被作為一種資源進行出售。例如:亞馬遜的AWS數(shù)據(jù)庫、騰訊云數(shù)據(jù)庫、阿里云數(shù)據(jù)庫、百度云數(shù)據(jù)庫等等。通過租用有實力公司的云數(shù)據(jù)庫,不僅能免除小企業(yè)自身架設(shè)機房,采購物理硬件,招聘專業(yè)運維人員的成本,還能享受高性能云數(shù)據(jù)庫服務(wù)以及高質(zhì)量的防護措施。

常見的數(shù)據(jù)庫攻擊方式及其防護措施如下:

1. 對弱口令或默認用戶名/口令的破解

在早期的數(shù)據(jù)庫中,有些數(shù)據(jù)庫在安裝時會有一個默認的口令,有些管理人員偷懶,干脆就延用了默認口令,那么黑客就可能從這個口令出發(fā)去獲取攻擊數(shù)據(jù)庫。

措施:采用安全程度高的口令,避免使用默認口令。

2. SQL注入

SQL注入指通過任意SQL代碼插入數(shù)據(jù)庫查詢,使攻擊者能夠繞過應(yīng)用程序安全措施,完全控制Web應(yīng)用程序后面的數(shù)據(jù)庫服務(wù)器,對數(shù)據(jù)進行CRUD操作。

措施:盡量避免直接將用戶的輸入放到SQL語句中,使用準備好的語句和參數(shù)化查詢,并且定期測試與數(shù)據(jù)庫交互的Web應(yīng)用程序,查看后臺日志信息。

3. 特權(quán)提升

數(shù)據(jù)庫會被許多人共同使用,有測試人員、開發(fā)人員、產(chǎn)品經(jīng)理等等,每個人員分配的權(quán)限是不一樣的。

最高級的root權(quán)限一般只開放給高級別的Leader。如果在權(quán)限配置中,一個用戶被誤授予超過其實際需要的訪問權(quán)限。那么攻擊者只需要得到少許特權(quán)用戶的口令,就可以毫無阻礙的進入數(shù)據(jù)庫系統(tǒng)。

措施:定期審查每個用戶的權(quán)限,通過后臺日志分析及時更改誤授人員的權(quán)限。

總結(jié)

至此為止,相信大家對數(shù)據(jù)庫以及相關(guān)知識已經(jīng)有了一個感性的認知。

數(shù)據(jù)庫的知識比較多,不是一兩篇文章就能講清楚的。筆者整體寫的也比較粗糙,希望能給各位同行帶來一些幫助。承蒙大家不嫌棄的話,筆者愿意在后續(xù)再寫幾篇相關(guān)的,與大家一同學習和進步。

文中部分內(nèi)容參考網(wǎng)上資料。

 

本文由 @pm_SWolf 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載

題圖來自Unsplash,基于CC0協(xié)議

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 通俗易懂

    來自上海 回復
  2. 寫的真好,簡單易懂,謝謝你

    來自上海 回復
  3. 非常感謝,你好我有幾個問題可否私聊v:17839130192

    來自浙江 回復
  4. 一下子懂了不少

    回復
    1. 歡迎交流!

      來自浙江 回復
  5. 謝謝!如果大家真的要在工作中使用的話,建議自己動手嘗試一下,這樣可以發(fā)現(xiàn)很多潛在問題。如有不懂,也可以私聊我一起交流探討。

    回復
  6. ?? 清晰明了

    來自北京 回復
    1. 謝謝!如果真的要在工作中使用的話,建議自己動手嘗試一下,這樣可以發(fā)現(xiàn)很多潛在問題。如有不懂,也可以私聊我交流。

      回復
  7. 好文,對于一些基本概念的講解應(yīng)該會有助于產(chǎn)品工作和思考,贊,期待后續(xù)文章

    回復
    1. 謝謝,后面寫幾篇更深入的,供大家一起交流學習。

      回復