技多不壓身 | 產品經理需知的那些數據庫基礎知識
技多不壓身,無論是什么數據產品經理還是其他品類的產品經理,都需要懂點數據庫知識。懂技術能讓你在跟開發撕逼中多了一個資本。
隨著近幾年AI智能,大數據的發展,“產品經理是是否需要懂技術?”“產品經理應該對技術理解到什么程度?”諸如此類的問題又再次出現在許多人的視野中,或者說它就未曾離開過。
筆者認為,這要具體放到某個具體業務場景或者行業下去分析,例如:作為一名數據產品經理,你可能需要懂一些數據庫,大數據的相關知識;作為一名AI語音產品經理,你可能需要懂一些關于自然語言處理(NLP)的相關技術。
當然,技多不壓身,懂技術能讓你在跟開發撕逼中多了一個資本。
在進入正文之前,我們先來思考幾個小問題:
-
- 當你在一個APP或者網站注冊賬戶時,你填寫的信息保存在哪里?
- 當你嘗試登陸和平精英準備吃雞時,APP怎么知道是你,并提供差異化服務?
- 當你修改一個賬號的密碼時,為什么可以用馬上新密碼登陸了?
- 當你在一個APP或者網站注銷賬號時,請問你的賬戶信息如何變化?
這四個問題看起來很簡單,但深究起來,它對應著數據庫的四個基本操作CRUD:即增加(Create)、讀取查詢(Retrieve)、更新(Update)和刪除(Delete)。
何為數據庫?
百度百科對數據庫給出以下定義:
所謂“數據庫”是以一定方式儲存在一起、能予多個用戶共享、具有盡可能小的冗余度、與應用程序彼此獨立的數據集合。
數據庫可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、查詢、更新、刪除等操作。
簡單的理解:數據庫(DataBase,簡稱DB)是用于保存有組織的數據的容器。
在DB中,數據通常以一種結構化的文件——表,作為其展現形式。對DB的操作可以看做是對DB中表的操作,而對DB中表的操作可以類比為對Excel中表的操作。
數據庫中的表有行和列的概念,符合我們的常規認知。
列是表中的一個字段,存儲著相同屬性的數據,例如:一列專門來存儲用戶的賬號昵稱。
行是表中的一個記錄,可用于存儲某一個用戶的完整信息,例如:用戶A,男,22歲,身高170cm,體重120斤。
表中的某一列(或一組列)我們稱為主鍵,其值可以用來唯一區分表中每個行(或者說每條記錄)。說白了,主鍵就是用來唯一代表某條記錄(某行)的。
主鍵需滿足以下條件:
- 任意兩行都不具有相同的主鍵值。
- 每個行都必須具有一個主鍵值,即主鍵不允許設置為Null的值。
舉個例子:在學生管理系統中,我們用學號來唯一代表每個學生,此時學號所在的那一列就是主鍵。
那么,如何理解某一組列作為主鍵呢?
當我們無法用單獨的某一列來代表一條記錄時,我們就要采用某兩列或者某幾列來共同代表一條記錄。
例如:一個表格記錄著一個班級的學生,不同課程的不同考試中的數據時,你想從中找出學生A,每一次考試中的語文成績時,就需要以學號和課程名稱這兩列來作為復合主鍵。
DBMS與SQL?
一般情況下,我們不會去直接操作數據庫,往往是通過數據庫管理系統(Database Management System,簡稱DBMS)去對數據庫進行統一的管理和控制,以保證數據庫的安全性和完整性。
典型的DBMS包括例如:MySQL,Oracle,mongoDB,Redis等等。
這里注意一點:在平時交流的時候,許多人會直接將MySQL,Oracle等稱作是數據庫,很多網上的資料也是這么寫的。但從嚴格意義上來講,MySQL,Oracle應該是數據庫管理系統。
為了方便大家跟網上的資料能夠共同理解,筆者在此暫時稱呼MySQL為數據庫。
目前主流數據庫基本分為兩類:關系型數據庫和非關系型數據庫。
關系型數據庫是指采用了關系模型來組織數據的數據庫。其最典型的數據結構是表,結構相對固定,格式一致,易于維護。但是靈活性不強,讀寫性能比較差,尤其是在海量數據的處理上,效率不高。
非關系型數據庫狹義上講并不是一種數據庫,而是一種數據結構化存儲方法的集合。因為大多數經典的關系型數據庫命名都為“***SQL”,為了做出區分,行業內通常將非關系型數據庫統稱為NoSQL。NoSQL格式靈活,可以很好的滿足高并發讀寫需求,成本低,速度快。
在安裝完MySQL之后,他會幫我們順帶安裝數據庫。我們就可以直接通過MySQL的命令窗口啟動服務,并對數據庫進行操作。
例如在下圖中,筆者在win10系統中,先以管理員權限打開PowerShell,然后啟動MySQL命令窗口,再通過“create database test;”創建一個名稱為test的數據庫。(一般情況下,不建議用root登陸)
這種操作方式對于非技術人員來講,并不是十分友好。因此在日常使用中,我會采用MySQL+Navicat來實現對數據庫的操作。
Navicat是一套多連接數據庫開發工具,工具中帶有靈活的數據庫圖形可視化界面,方便用戶直接進行類如Excel的表格操作,由此來實現最終的數據庫操作。
SQL(Structured Query Language)是結構化查詢語言,可以用來和數據庫通信,絕大部分DBMS都支持SQL,簡單的說就是通過編寫SQL語句來操作數據庫。
在下面的操作中,筆者也將以MySQL+Navicat作為基礎開發環境,以SQL語法為說明。
- MySQL安裝教程:https://www.runoob.com/mysql/mysql-install.html
- Navicat安裝教程:https://blog.csdn.net/pdcfighting/article/details/81669537
實戰演練
對數據庫DB,數據庫管理系統DBMS,結構化查詢語言SQL有所了解后,讓我們繼續回到開篇講的四個問題。
- 當你在一個APP或者網站注冊賬戶時,你填寫的信息保存在哪里?
- 當你嘗試登陸和平精英準備吃雞時,APP怎么知道是你,并提供差異化服務?
- 當你修改一個賬號的密碼時,為什么可以用馬上新密碼登陸了?
- 當你在一個APP或者網站注銷賬號時,請問你的賬戶信息如何變化?
將這四個步驟拼接在一起,可以得出一個最簡單的用戶賬戶注冊、登錄、修改、注銷的流程。
這四部分對應到數據庫的相關操作就是增加(Create)、讀取查詢(Retrieve)、更新(Update)和刪除(Delete)。
1. 事前準備
我們先在Navicat中跟一個已存在的數據庫進行連接,然后建立一張名為user_test的表,表中分別有字段:ID(作為主鍵)、account(賬戶名)、password(密碼)、source(注冊來源)、name(真實姓名)、age(年齡)、job(職業)。
2. 注冊步驟及其SQL
在用戶注冊時,會在注冊界面填寫相應的信息,點擊頁面底部的注冊按鍵,系統將執行數據庫記錄插入操作,其通用SQL語法為:
- 其中INSERT INTO表示插入動作,大小寫都可以,標準寫法為大寫。
- 其中table_name為表名,指你所要操作的表,一般為小寫。
- 其中field1, field2,…fieldN為對應的字段名,一般字段命名為小寫或駝峰式。
- 其中value1, value2,…valueN為每個字段對應的值,寫入值需符合字段定義的數據類型。
最后,所有SQL語法中都以 “;”作為語句結尾,這個不要漏了。
在本例中,對應的SQL為:
經過插入操作后,數據庫中表的結果為
在這里,因為我們的表中的ID字段設置為主鍵,并且由數據庫進行自增操作,所以我們不會對其進行額外操作。
3. 登陸步驟及其SQL
假設當前數據庫中user_test表的數據如下:
在用戶登錄時,系統會根據用戶輸入的賬戶名去數據庫中檢索,如果沒有查詢到相應的賬戶名,則提示賬戶不存在;如果查詢到賬戶名,則再根據數據庫中該賬戶名的密碼去跟用戶登錄時輸入的密碼進行匹配,如果匹配失敗,則提示密碼輸入錯誤,反之登陸成功。
所以在這個步驟中,執行的是數據庫的查詢操作,其通用的SQL語句為:
- 其中SELECT代表查詢操作,一般用大寫。
- 其中column_name,column_name…表示你要查詢的列名,跟表中的列名要保持一致。
- 其中table_name代表你所要查詢的表。
- 其中[WHERE Clause]表示你要查詢這張表時,所約束的條件。
在本例中,假設是RD李四登陸,則根據李四的賬戶名“用戶2”查詢其密碼,年齡,注冊來源,職業,姓名這幾個字段信息的SQL為:
經過查詢操作后,得出的查詢結果為:
4. 更新步驟及其SQL
假設當前數據庫中user_test表的數據如下:
在用戶登錄成功后,可以對密碼進行更改,系統根據當前登陸賬戶,將舊密碼更改為新密碼。
所以在這個步驟中,執行的是數據庫的更新操作,其通用的SQL語句為:
- 其中UPDATE代表更新操作,一般用大寫。
- 其中table_name代表你所要操作的表。
- 其中field1,field2代表你要更新的字段,需要跟你表格中定義的字段名一致。
- 其中new-value1,new-value2代表更新字段的值,寫入值需要與定義的數據類型一致。
其中[WHERE Clause]表示你要更新這張表時,所約束的條件。在這里注意一點,進行UPDATE操作時,一定要跟上[WHERE Clause],不然將會把整張表的數據更新。
在本例中,假設我們要對QA王五的密碼和職業進行更新,則SQL為:
經過更新操作后,數據庫中表的結果變為:
5. 注銷步驟及其SQL
假設當前數據庫中user_test表的數據如下:
當用戶試圖注銷自己的賬號時,系統會根據相應的賬戶名對用戶的信息進行刪除。至于刪除哪些信息,取決于業務要求。有些應用會將用戶信息全部刪除,有些則會保留一些基礎信息,方便用戶二次注冊的時候,可以快速完成。
所以,在這個步驟執行的是數據庫的刪除操作,其通用的SQL為:
- 其中DELETE表示刪除操作。
- 其中table_name表示你要操作的表格。
- 其中[WHERE Clause]表示你要刪除某條記錄時,所約束的條件。在這里注意一點,進行DELETE操作時,一定要跟上[WHERE Clause],不然將會把整張表的數據刪除,數據庫數據一旦刪除,是不可恢復的,切記!
在本例中,假設我們要將RD李四的賬戶注銷,并且刪除其所有數據,則SQL為:
創新型數據庫
1. 時序數據庫
時序數據庫(Time Series Database,簡稱TSDB)是非關系型數據庫中的一種,也是很重要的一種。
隨著目前AI智能的發展,在很多場景下,特別是將來的工業互聯網中,我們需要收集海量的過去式數據,借此來分析和預測將來可能發生的事情。例如:金融交易股票走勢,物聯網傳感器設備的測量數據,氣溫或日濕度預測等等。
以股票走勢預測為例,單靠目前股票的位點是無法分析的,只有結合股票在前十分鐘,前一個小時,甚至前幾天的走勢,才能更加精準的預測出未來某一時刻的具體情況。
時序數據庫就是專門用來存儲海量時序數據的。而時序數據就是基于時間的一系列數據。
簡單地可以理解成,它以時間為主坐標軸,以需要被記錄的數據作為縱軸,通過規則的時間間隔或者是不規則的時間間隔去表征一系列數據的規律性或異常性變化。
時序數據庫包含以下幾個基礎部分:
- Metric: 度量,相當于關系型數據庫中的table。
- Data point: 數據點,相當于關系型數據庫中的row。
- Timestamp:時間戳,代表數據點產生的時間。
- Field:度量下的不同字段。比如位置這個度量具有經度和緯度兩個field。一般情況下存放的是會隨著時間戳的變化而變化的數據。
- Tag:標簽,或者附加信息。一般存放的是并不隨著時間戳變化的屬性信息。timestamp加上所有的tags可以認為是table的主鍵。
有的小伙伴可能會說,直接在一般的數據庫中,加入一個代表時間的列,不就可以完成嗎。在數據比較少,數據庫操作不頻繁的時候,這種方法還是可以的。
隨著數據存儲量的增多,如果想要達到跟時序數據庫一樣的效果,那就會頻繁的操作數據庫,這會造成極大的開銷,從而極大的降低讀寫速度。
總的來說,時序數據庫具有大規模數據支持,多精度數據存儲,多標簽數據查詢等特點。
2. 圖數據庫
非關系型數據庫NoSQL大致可以分為四類:
- 鍵值(key-value)數據庫
- 圖數據庫
- 列存儲數據庫
- 文檔型數據庫
圖數據庫就是NoSQL其中的一種,它以圖這種數據結構存儲和查詢數據。圖由兩個主要元素組成:節點和關系。
節點代表一個實體(時間,地點,人或其他數據),關系則代表兩個節點之間的關聯方式。
相比于NoSQL中的其他類型數據庫而言,圖數據庫具有更加豐富的模型表現能力和更加高效的索引。
在實際應用中,業務邏輯往往十分復雜,如果用關系型數據庫來表示各個實體之間的潛在關系,則需要建立十分多的關聯表。數據庫需要通過關聯表間接地維護實體間的關系,導致數據庫的執行效能低下,同時也會引起關聯表的數量急劇上升。
例如:在一個訂單系統中,要清楚表現出用戶、訂單、商品之間的邏輯關系,需要建立四張關聯表,這顯得十分復雜,開發效率也很低。
而在圖數據庫中,我們只需要建立四個節點,并用關系來表示節點之間的邏輯,最后用任意兩個節點之間的關系去索引,即可提升效率。隨著業務邏輯性愈發的復雜,數據量的增多,關聯表數量會急劇上升,這時圖數據庫的優勢愈發明顯。
小結
隨著大數據,AI智能的發展,為解決不同業務需求,越來越多的創新數據庫隨之出現,時序數據庫和圖數據庫就是其中之一。時序數據庫解決了時間序列數據存儲,索引的問題;圖數據庫則解決了復雜邏輯下,各個實體之間相互表征,索引的問題。
數據庫攻擊及防護
對于每個應用而言,數據庫為其提供了前后臺數據交互的作用。對于企業而言,數據庫存儲了海量的用戶數據,一旦數據庫被攻擊或被破壞,將會導致用戶信息泄露,進而導致一系列無法彌補的損失。因而,數據庫的保護工作極其重要,特別是一些涉及金融,政府層面的數據。
在云計算領域中,數據庫還被作為一種資源進行出售。例如:亞馬遜的AWS數據庫、騰訊云數據庫、阿里云數據庫、百度云數據庫等等。通過租用有實力公司的云數據庫,不僅能免除小企業自身架設機房,采購物理硬件,招聘專業運維人員的成本,還能享受高性能云數據庫服務以及高質量的防護措施。
常見的數據庫攻擊方式及其防護措施如下:
1. 對弱口令或默認用戶名/口令的破解
在早期的數據庫中,有些數據庫在安裝時會有一個默認的口令,有些管理人員偷懶,干脆就延用了默認口令,那么黑客就可能從這個口令出發去獲取攻擊數據庫。
措施:采用安全程度高的口令,避免使用默認口令。
2. SQL注入
SQL注入指通過任意SQL代碼插入數據庫查詢,使攻擊者能夠繞過應用程序安全措施,完全控制Web應用程序后面的數據庫服務器,對數據進行CRUD操作。
措施:盡量避免直接將用戶的輸入放到SQL語句中,使用準備好的語句和參數化查詢,并且定期測試與數據庫交互的Web應用程序,查看后臺日志信息。
3. 特權提升
數據庫會被許多人共同使用,有測試人員、開發人員、產品經理等等,每個人員分配的權限是不一樣的。
最高級的root權限一般只開放給高級別的Leader。如果在權限配置中,一個用戶被誤授予超過其實際需要的訪問權限。那么攻擊者只需要得到少許特權用戶的口令,就可以毫無阻礙的進入數據庫系統。
措施:定期審查每個用戶的權限,通過后臺日志分析及時更改誤授人員的權限。
總結
至此為止,相信大家對數據庫以及相關知識已經有了一個感性的認知。
數據庫的知識比較多,不是一兩篇文章就能講清楚的。筆者整體寫的也比較粗糙,希望能給各位同行帶來一些幫助。承蒙大家不嫌棄的話,筆者愿意在后續再寫幾篇相關的,與大家一同學習和進步。
文中部分內容參考網上資料。
本文由 @pm_SWolf 原創發布于人人都是產品經理。未經許可,禁止轉載
題圖來自Unsplash,基于CC0協議
通俗易懂
寫的真好,簡單易懂,謝謝你
非常感謝,你好我有幾個問題可否私聊v:17839130192
一下子懂了不少
歡迎交流!
謝謝!如果大家真的要在工作中使用的話,建議自己動手嘗試一下,這樣可以發現很多潛在問題。如有不懂,也可以私聊我一起交流探討。
?? 清晰明了
謝謝!如果真的要在工作中使用的話,建議自己動手嘗試一下,這樣可以發現很多潛在問題。如有不懂,也可以私聊我交流。
好文,對于一些基本概念的講解應該會有助于產品工作和思考,贊,期待后續文章
謝謝,后面寫幾篇更深入的,供大家一起交流學習。