結構、半結構、非結構式資料是啥意思?
翻查大數據相關資料系統時,第一個被咬到的就是這些專有名詞。但這究竟是什麼鬼意思?
結構式資料 (structured data)
資料擺放得整整齊齊,在放置進倉庫時就已經受到了精確定義,而且拒絕忍受任何例外。舉例來說,每筆資料都有固定的欄位、固定的格式、固定的順序甚至是固定的佔用大小。是很有條理的資料類型。違規的資料根本就進不了這類資料庫裡面。
總之把它視為傳統關聯式資料庫中的表格就差不多了,一般說起結構式資料時,似乎也都是拿關聯式資料庫中存放著的東西當範例。
將東西放得整整齊齊,特色當然是清晰、明瞭、且容易被預期。而既然規則都能說定,這也就意味著資料很輕鬆就能被後續程式取用分析,不用考慮一堆的例外狀況,程式處理相當容易,也很方便被整合到某些特定的框架之內。
四處觀察看看各家解決方案就能發現,資料分析工具與報表產生工具,大都是以結構式資料作為第一優先的資料來源。
容易處理或許是一個考量點,另一個考量點大概也與與關聯式資料庫數量特多有關。
非結構式資料 (unstructured data)
一言以蔽之,非結構式資料就是亂成一團,讓人無從打理起的資料。舉例來說,一支影片、一串缺乏欄位概念的純文字等都是。
此處的差異不在於「資料的用途」,而在於「資料的格式」。
非結構式資料與結構式資料的對比
舉例來說,A、B 同樣是記錄了一百名用戶聯絡方式的資料集。
A 資料集強制律定每個用戶佔用一列,每列必定有三欄,其中第一欄是人名、第二欄是電話號碼、第三欄是地址。其中電話號碼一定是要用 + 開頭的國際電話號碼格式,位數為 10 ~ 14 位阿拉伯數字,地址則最長不能超過兩百五十個字元。
B 資料集含有 A 資料所有的全部內容,但是有些資料分成三行,有些行又含了好多人的資料,有些資料旁加了客服人員對這名客人的抱怨,有些資料中間夾了別筆資料,有些名字處畫了個箭頭指向好幾行外的某個電話號碼。我們甚至很難統計資料總共有幾「筆」--這取決於用戶怎樣定義「筆」這個單詞的意思。
B 資料集就是非結構化資料。你可以想像網頁就是這種資料的代表,您當然可以在裡面找到某個公司的聯絡方法。他確實含有資料。
但是要怎麼找?沒準的。
非結構的優勢
例子 B 聽起來很糟糕?確實如此。它很難被處理。
但它當然有用。
這麼說吧,所有的資料,最初本質就是非結構式的,我們眼中看到的結構、格式、規則都是事後人為補上去的。如果要求結構化,那麼也就必然等於捨去了結構規範之外的訊息。比方說前面 B 資料集提到了「客服人員的抱怨」,這種情報就無法在清晰整齊的三欄式 A 資料集中找到。
反過來說。結構清晰的 A 資料集中,也無法納入某些不完備的資料。比方說有個用戶擁有地址,但是沒電話,這時這個可憐的傢伙就是無法被記在使用 A 資料集的系統裡,因為他的資料不合規定。
結構化的過程中會丟失資料以及拒絕資料。這就像是為了把家裡整理得乾乾淨淨,我們總是難免會要丟掉一些東西,而且還要阻止自己日後不要亂買東西一樣。這是易用性和全面性之間的取捨問題。
一般來說,企業會希望能完整記錄非結構化的資料,將其收納存放在一邊,作為日後各種未預期應用的參考。但是在最常用,最需要效能的地方,還是會希望使用結構化資料庫,因為不會遇到意外與例外,處理起來更加方便。
半結構式資料 (Semi-structured data)
半結構式資料,顧名思義其規格介於結構與非結構資料庫之間。
這種資料具有欄位,因此可以依據欄位來進行查找,使用方便,但是除此之外它不保證一致性。舉例來說,一個資料表中,可能只有部份資料列含有電話欄位,同時只有部份資料列含有地址訊息。
這不是「允許 Null」這種結構式資料的設定方式,而是「根本不用對結構進行任何設定」,因此就算使用者完全沒想過未來要加什麼資料,也可以臨時突來一筆地加入像是「用戶褲子的顏色」這種情報。
像如下的 XML 就是一種這樣的範例。
<users>
<user>
<name>Squall</age>
<age>18</age>
<weapon>gunblade</weapon>
</user>
<user>
<name>Mario</school>
<job>plumber</job>
<shoe_color>brown</shoe_color>
</user>
</users>
如果以上方的 XML 存放資料,用戶確實可以準確地提取出 name
的值,欄位就在那裡,但是用戶也可以隨時追加任何其他新的欄位,不受到任何限制。
半結構的好處是容易收納變數極多或難以預測的資料集,並依然保有可查找性。比方說網路購物平台的商品資料,可能就有千百種商品上萬種欄位,畢竟蔬菜與電腦需要的欄位鐵定不同,而且每天都可能會再蹦出一些新的屬性出來。這時用半結構化資料來進行收納就方便許多。
缺點是什麼?缺點是半結構化資料會消耗掉額外的空間。因為既然有欄位結構,會需要紀錄下欄位名;但既然每筆資料的結構都不一致,那麼就不能如同結構式資料那樣讓整個表格共用欄位名稱,而必須每筆都單獨記錄一次--就如同上面 XML 的例子中所看到的那樣。而這也會對硬碟讀寫造成一些額外壓力,效能本質上就會略差於其他兩者,需要用其他技術來補足。