[E0-02]資料庫思維

天依然藍著,沒心沒肺。知了依然叫著,撕心裂肺。馬路依然擁擠,繁華和你的孤單和諧相處。打開微博縱覽天下大事,打開知乎和各路精英談笑風聲,刷完微信的所有小紅點你收穫滿滿。合上手機你依然為今晚吃麻辣燙還是酸辣粉焦慮。生活不好不壞,教程不早不晚不緊不慢持續更新著。放下家國情懷人工智慧貨幣政策房價漲跌,一起做點小事兒吧。比如收回狂亂思緒繼續學習EXCEL:)好消息是,我們逐步開始脫虛向實,硬的咯牙的fuck goods(乾貨)說來就來。吶,這篇就是。

1.定義問題

We already walked too far, down to we had forgotten why embarked.不要因為走得太遠,而忘記為什麼出發。

任何思維方法論都是有場景的,牛頓的三大力學定律再牛,放到瘋狂的股市投機市場照樣會感嘆「我能看懂星球的運轉,卻看不懂人性的瘋狂」(大意)。之後托腮沉思皈依我佛,30歲之後就沒提出啥牛逼的科研成績了。可見思維場景有多重要。同樣,資料庫思維的應用場景先要從EXCEL的不同數據表類型說起。如果你拿EXCEL是用來當記事本寫寫字用的,好走不送,拜拜了您。如果你準備用EXCEL存儲數據,那麼,你要知道EXCEL數據表實際分兩種:

  • 報表型數據表。這種表格的典型特點是數據表本身已經是**最終輸出結果**,數據是用來**給人閱讀的**,所以這種表格是可以完全**沒有定式沒有定法的**,各種配色,合併單元格,斜線標題,看你心情隨便上,沒有任何問題。針對報表型數據表的任何改動唯一需要考慮的除了數據準確性以外,就是閱讀者的體驗。典型的報表型數據表如學生課程表(列印出來放在寫字檯上用),公司財報(面向投資者提供信息),工資條(供員工核對工資信息)。
  • 數據源型數據表。這種表格的典型特點是數據本身**不是最終結果,是用來供後續計算分析加工的**,比如套用公式、生成數據透視表、排序篩選、圖形化繪製等等。因為要**高效準確**完成後續加工過程,所以我們就要對數據源提一些規範化要求。

這篇文章要聊的問題核心是:針對數據源型數據表,我們都要那些規範化要求,以及這些要求背後的原因是什麼?

2.何謂資料庫

先來看看官方定義(來自維基百科wikipedia.org):

資料庫,簡單來說可視為電子化的文件櫃——存儲電子文件的處所,用戶可以對文件中的數據運行新增、截取、更新、刪除等操作。資料庫指的是以一定方式儲存在一起、能為多個用戶共享、具有儘可能小的冗餘度、與應用程序彼此獨立的數據集合。

學習資料庫需要掌握哪些知識點呢,看下圖:

好啦,快合上你張大的嘴巴,我是嚇你的。你只需要讀懂下面幾句話:

  • 典型的資料庫是關係型資料庫,最簡單的關係型資料庫可以理解為一張結構化二維表格。
  • 什麼是結構化二維表格?有列(或者叫標題,列標題,是一個意思)有行(至少有一行數據)就是二維表格。如果對每一列數據都進行了完整定義,那就是結構化二維表格。

我知道你還是一臉懵逼,少啰嗦,看例子。先看一張貌似平淡的數據表:

這是一張常見的學生信息表,橫向有行,豎向有列,是二維表,沒有問題。問題是如何結構化?結構化是如何體現的?我們再看一張圖:

看出點兒門道沒?這張欄位定義表給剛才那張學生信息表加了限制,分別從列標題(資料庫中通常稱為欄位,後文不做特別說明的話,列標題欄位是一個意思)名稱、類型、長度、是否為空做了詳細限定。比如:

  • 編號列,一串數字,最大的用處就是用來**唯一**確定一個學生的,一個學生只有一個編號,一個編號只對應一個學生。這種特定的欄位在資料庫中通常命名為ID列,往往數字本身是沒有特別含義的,最大的用處就是一個值就能**唯一**確定一行數據,這就是資料庫中**主鍵(key)**的含義,標定特定的一行數據用。
  • 姓名、年齡、出生日期列。類型基本都看得懂吧基本上和EXCEL單元格格式類型一樣的,不過這裡多了一個限制:不能為空,這樣就確保這些列的任意一行都是有數據的。想想看,EXCEL對數據的要求是很鬆散的,資料庫是很嚴格的。
  • 顏值、是否畢業列。可以為空,從字面意思也可以大致理解含義。這種列往往對核心數據的影響一般,有了我就處理或顯示,沒有也行。

小結一下:針對二維數據表每一列都嚴格定義了約束條件的就是結構化數據表,一個或多個結構化數據表組成的文件就是資料庫。

3.資料庫實例

最簡單的例子當屬EXCEL的同門師兄ACCESS了,為了讓這部分的例子不太無聊,我們開個腦洞,設想一個場景。克萊登大學著名學渣「慕容富貴」(不用懷疑,這麼奇葩混搭的名字我是故意這樣取的)喜歡著名學霸「諸葛狗剩」(這名字也夠辛辣吧),慕容先生通過賄賂機房看門的王大爺搞到了學校管理的學生資料庫數據,目前能夠看到的信息是兩張表,分別是學生信息表和選課信息表。資料庫和數據表的大致關係以及數據表欄位定義如下圖所示:

我們看上圖,最右側的兩張截圖定義了欄位約束和類型信息,很容易看明白吧。注意一下學生信息表的學生編號旁邊有個小鑰匙圖表,這個意思就是這個欄位是主鍵,能夠唯一標識所在行數據的。下面的選課信息表為什麼有兩個小鑰匙圖標呢?因為一個課程可以被多個學生選,一個學生也可以選多個課程,只有學生+課程組合在一起才能唯一標識一行記錄。我們再來看兩張表的實際內容:

首先看學生信息表,狗剩姑娘(好奇怪)的顏值是美若天仙,富貴小夥子沒寫顏值,沒寫……我懂了,應該不是最丑吧只能說。再看選課信息表,注意,選課信息表的學生信息部分沒有使用學生姓名而是編號,想想為什麼?第一,解決了重名信息錯亂問題。第二,在兩張表之間建立了準確的相互引用關係。第一句話很好理解。第二句話,通過這種表格設計,我們很容易拿到各種綜合查詢數據。比如,列出選了高數的美若天仙的學生清單,列出狗剩姑娘都選了哪些課程等,都是一句話(SQL語句)的事情。等一下,我們再看看第二張表,第一行第二行,第三行第四行的學生編號分別都是重複的對不對?注意,儘管重複,資料庫是沒有合併單元格概念的,重複就重複,大量不合適的重複通過改善表結構設計來規避,絕不允許合併單元格操作。順便提一句,通過上表我們發現,狗剩姑娘選了高數和建築兩門課程,嗯,書香門第的清雅姑娘。富貴同學選了生理衛生和養豬理論兩門課程,哎呀我去,一股屌絲氣息鋪面而來,別追人家姑娘了,好好養你的豬去吧。

4.資料庫思維啟示錄

所謂資料庫思維,就是借鑒資料庫對數據表的設計要求,來改善和理解EXCEL中數據源型數據表的相關規範。注意,資料庫思維是兩層意思。一層是理解,原來不太明白的結合資料庫很容易明白;一層是改善,結合資料庫要求更好的規範EXCEL數據表。這部分我們先講整體層面的思考結論,下一節看實操。

表格上方不要出現表標題

  • 第一,資料庫表設計從來沒有表標題的概念,更加不可能在數據區域出現表標題;
  • 第二,表標題佔用了列標題行,會對後續分析造成很大的干擾;
  • 第三,表標題信息可以體現在sheet名稱中。

數據表設計要有唯一標識列

或者叫缺少主鍵欄位,或者叫缺少ID列,一個意思。為什麼會有這個建議,只是為了單純模仿資料庫?不是的,有實際意義。

  • 保證你對源數據可以隨時恢復的能力。不管你是排序篩選各種對行順序的折騰,最後只要按照ID列做一次排序就回來了。
  • 大幅度減少查詢難度。我們知道EXCEL對查詢的支持時比較弱的(和資料庫比查詢簡直沒法比),通過添加ID列並且讓ID列放在最左邊應用VLOOKUP取數據會簡單很多。
  • 作為輔助列配合工具將**複雜多列二維表**轉化為**簡單列二維表**,這種做法的細節後文會詳述。
  • 養成一個每行有唯一標識欄位的良好意識。相信我,很多困擾使用者的重名問題,多條件查詢問題,逆序查詢問題,往往一個ID列就可以解決。

不要在原始數據表中增加任何匯總或合計行

  • 根據原因是,這樣做會破壞原來結構化的數據分布,讓部分數據不再是規整的了,想想看如果在學生信息表的最後一行加一個學生總數=110的匯總,那這個110到底是屬於哪個現有欄位的?

不要合併單元格

同樣的,這會破壞表結構,正確的做法是,讓數據重複。保持數據適當重複時完全可以接受的,還記得前文提到的課程信息表嗎?一個學生可以選擇多個課程,所以學生編號重複是很正常的。換個角度看,資料庫里根本就沒有合併單元格這個概念。引申一下,斜線表頭是相同道理,都是被禁止的。

不要空行空列

很簡單,空行空列也許在視覺上沒有問題,但在計算上會有各種問題。隨便舉個例子,空欄位將直接導致數據透視錶行標籤出現空白標籤。

工作表與工作簿規劃

一個工作表(SHEET頁)用來描述一個對象,(比如學生信息,比如學生選課信息),一個工作簿(EXCEL文件)用來描述一類數據(比如學生基礎信息)。適當控制工作表之間的引用,絕對不要產生工作簿之間的引用。

欄位內容原子化

每個欄位的內容一定是不能再分了,比如數量如果內容是「35個」這就不是原子化,一定還能分成兩列分別是數量和單位。為什麼有這個要求?一個原因是,資料庫包括EXCEL中,對分散數據的拼接比準確拆分容易的多;另一個原因是,含有數量的非原子化內容比如「35個」將使得數據失去可計算性;第三個原因,原子化意味著大家都是一個粒度的(反正都已經拆到不能再拆了),而非原子化則可能有各種程度的粒度,這對數據之間的引用是非常不利的。

相同內容統一表述

比如班級名稱,在所有地方同一個班級都應該是相同的表述,「天物強化班」和「天體物理學班」不應該同時出現,軟體會認為是兩個班級。EXCEL中應該使用數據驗證下拉框規範此類問題。

特殊格式欄位格式要滿足格式要求

比如日期時間欄位,不能既有中文又有英文,既有-又有,這都不規範。

每列數據類型保持一致

想想看,數據表設計的時候,每列數據是不是天然一致的,比如出生日期列類型是日期,那該列數據要麼是一個具體日期要麼空著,絕不允許出現「不記得啦」,「丑年寅時」這種內容。

禁止空格換行等非可見字元破壞數據本身

很簡單,不管是在EXCEL眼裡,還是在任何一個資料庫系統眼裡,「西門」和「西 門」(中間加了空格)都是不同的數據,這些不可見字元會是定時炸彈,表現出各種莫名其妙的問題。比如你檢索「西門」就無法檢索帶空格的那條記錄。有的同學喜歡ALT+ENTER強制換行或者使用空格將人名對齊,這都是不可取的。

不要批註

這一條估計不少人不太理解。我的看法是,批註內容在數據內容上是不可見的,輸入的信息有沒有關鍵信息也是不知道的,如果確實需要批准寧可建一列數據列叫做批註或者備註。

5.資料庫思維實操

好,口說無憑,上文提到的那些「要與不要」你真的掌握了嗎?我做了一個表作為反面典型,見下圖。先不看我後面的說明,你自己來想一想這張表都有哪些不合規範的地方。

以下是思考時間

思考結束

我們先來梳理以下這張表整體存在的問題(下文問題列表需要和上圖數字部分是一致的):

  • 1.表格上方不要有表標題
  • 2.欄位對齊不要用空格
  • 3.年齡列沒有原子化
  • 4.日期列輸入數據不統一不規範
  • 5.欄位內容不符合列欄位定義且使用了強制換行
  • 6.期末成績列欄位內容混亂不統一
  • 7.不要合併單元格
  • 8.不要出現空行
  • 9.不要斜線表頭
  • 10.不要批註信息
  • 11.「生物化學班」和第一行的「生化班」實質內容相同,表述不一致。

你找全了猜對了嗎?

6.樸實的就是最好的

回到問題本身,到底什麼數據是EXCEL喜歡的?我的答案是,結構化的,類別統一的,最接近資料庫表樣式的就是最好的。

  • 第一行是標題行。風雨無阻,第一行一定是標題行。
  • 第一列是ID列。儘管不是強制要求,但我強烈建議你這麼做。
  • 每列數據不可拆分,已經原子化。每列數據類型相同,格式規範。
  • 拒絕合併單元格,拒絕斜線表頭,拒絕空行空列。
  • 沒有空行空列。

看看下圖(標題部分不是數據表區域,別誤會),簡簡單單的資料庫表,就是最好的EXCEL數據源表了。

有任何建議,隨時歡迎反饋。感謝閱讀,如能轉發,感謝加倍。

移步公眾號「怒馬說」獲取更多 EXCEL 乾貨。

推薦閱讀:

如何將多個文件夾的工作簿合併到一個文件夾
PowerBI大師視頻課程全面上線

TAG:MicrosoftExcel | Excel使用 | Excel技巧 |