結構、半結構、非結構式資料是啥意思?

翻查大數據相關資料系統時,第一個被咬到的就是這些專有名詞。但這究竟是什麼鬼意思?

結構式資料 (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 的例子中所看到的那樣。而這也會對硬碟讀寫造成一些額外壓力,效能本質上就會略差於其他兩者,需要用其他技術來補足。