資料是什麼——資料的倉庫

趙丹 Diana Zhao發表於2014-02-23

20年前的軟體主要用來製造資料,那時候資料很少,上千萬行的關聯式資料庫表就已經是世界級水平了,只有銀行電信這種高大上的行業才會用到。而今,別說千萬了,千億似乎也算平常水平。對於PB級資料來說,如果一個物件資料量為1k,那也至少有一萬億個物件,當然從邏輯上看,這些資料可能表達的不是一萬億個物件,而是少數物件的總共一萬億個歷史狀態,這些狀態資料是資訊系統日復一日年復一年不停製造出來的。為了處理大量資料,首先想到的辦法是把資料集中儲存,統一管理,就像對待各種貨物一樣。 最初的資料庫確實是按照倉庫設計的。在傳統的關聯式資料庫中,每一個值都被擺到一個三維空間的網格中的一個格子裡,三個維度分別是列、行、表。如果資料在時間上變化了,就直接把格子裡換成變化後的新值。這是一個以格子為中心的設計,格子基本不變,而裡面的資料經常變化。這也是一個沒有歷史的設計,倉庫只關心現在存了什麼,不關心以前存過什麼,因為貨物的價值只在它們本身,歷史上的東西已經不是東西了。既然是以格子為中心,那麼節約格子就成了要務,任何企圖多佔格子的行為都是不被允許的,每個資料庫設計者都被諄諄教誨,好的設計就是沒有冗餘,每條資料僅止出現一次。但是在實踐中這是完全沒有保證的,因為這樣的資料庫系統只管格子,不管格子裡存的內容,如果不同的格子放著相同的值,那是完全沒有問題的。在應用設計上,對於一些經常出現的高頻值,會編入程式碼表,但每個應用都有各自的程式碼表,而轉換為程式碼之後,看起來絕不相似,無法自動合併。

事實上,有意義的值是很少的,因為意義總是人賦予的,地球上有史以來存在過的人類總資料說在一千億左右,如果每人每天說1000句話,那麼有史以來人類講過的話也不過幾百PB,人類書寫的各種符號就更少了,因為書寫總比講話困難,並且其中可能還有80%是重複的,諸如“您吃了嗎”之類,以至於數量級還會進一步降低。對於數值類的值,雖然理論上各種數域都可以是無窮的,可能存在無窮多個值,但是實際上,有意義的值是很少的,因為意義總是人類賦予的,人給一個值賦予意義總要表達一下,就算每次都能一句話講明白了,也僅能給所說的話想等數量級的值賦予意義,事實上也是這樣,體溫計產生的值總是在35.0到42.0之間,北京的氣溫總是在-20到+45之間,有理數集的無限可能對於實際產生的數值個數並無什麼幫助。所以窮盡所有有意義的值並儲存下來,對每個值給予一個固定編址是可行的,今天的技術已經能將其實現。

真正困難的事情是找到值的意義,也就是在巨大而複雜的知識網路中定位到值所關聯的概念和物件。前面已經說了,傳統的資料庫中,格子就代表意義,不同的格子可以儲存相同的值,但是資料庫系統只關心格子,從格子找到值容易,從值找到格子,如果不是根本不可行,也是極為困難。但是對於傳統的應用,這似乎不是問題,因為值在產生的時候已經被賦予了意義,並且對值的任何操作之前幾乎總是已經確定了它所在的那個格子。唯一一個例外的情況是搜尋,搜尋是按照值找格子的過程,但是在傳統的資訊系統裡,搜尋是很少的,並且簡單到只對單一物件型別進行。這也是為什麼某個以搜尋為核心業務的企業會顛覆傳統的資料庫理念的原因,因為這類企業對於從值找格子這種在傳統看來非主流的逆向操作有著巨大、複雜而且迫切的需求。

相關文章