我一直在研究NoSQL數據庫,並且出現一個常見的主題是關係數據庫不適合存儲非結構化數據。例如:爲什麼關係數據庫不適合非結構化數據?
不幸的是,關係數據庫使用的嚴格定義,基於模式...是一個貧窮的適合於非結構化和半結構化數據 [source]
我有一個很難理解這是爲什麼。例如,如果我想在關係數據庫中存儲圖像或一些原始文本,我能不能將它作爲文本類型存儲(例如,在單個列表或鍵值表中)?
我一直在研究NoSQL數據庫,並且出現一個常見的主題是關係數據庫不適合存儲非結構化數據。例如:爲什麼關係數據庫不適合非結構化數據?
不幸的是,關係數據庫使用的嚴格定義,基於模式...是一個貧窮的適合於非結構化和半結構化數據 [source]
我有一個很難理解這是爲什麼。例如,如果我想在關係數據庫中存儲圖像或一些原始文本,我能不能將它作爲文本類型存儲(例如,在單個列表或鍵值表中)?
我最喜歡的非結構化數據的例子不適合關係數據庫,它是計算機硬件部分數據庫。
想象一下,你有一個銷售計算機硬件的網上商店。你的產品數據庫將如何看待?
每個產品都有一個name
,price
和vendor
。但CPU有clock rate
,cache size
和# of cores
,顯示器有size
和resolution
,RAM模塊有capacity
,硬盤驅動器也有capacity
(這不能與RAM模塊相比較)。
如何將這些數據存儲在關係數據庫中?
product
,property
和value
一個巨大的表(但你用什麼類型value
當某些屬性是數字和其他不是?)所有三個選項都是有效的,但他們都沒有真正令人滿意。
但是,當你有一個沒有嚴格模式的面向文檔的數據庫時,它會變得簡單得多,因爲每個條目可以有任何一組可以具有任何類型值的屬性。
讀者可能還想在[Q:可支持專用屬性的數據庫模式](http:/ /)中查看一個關於通過@PerformanceDBA將非結構化數據存儲在關係數據庫中的問題, /stackoverflow.com/questions/4304217/database-schema-which-can-support-specialized-properties) –
「您可以爲每個產品類別單獨列出一個表」 這是您在此情況下應使用的確切解決方案。我很好奇你爲什麼認爲它沒有吸引力? – Gagege
我不認爲這個問題應該是非結構化與非結構化數據。這關係到大量數據的性能。我有一些嘗試將SQL數據庫轉換爲非結構化數據存儲的經驗。就我而言,我有一堆需要進入表格的動態(JSON)對象。我使用的是SQL,因爲這些對象通過父子關係(即自聯接)相互關聯。它適用於約5,000個對象的測試數據集。
使用SQL
然而,我的生產數據庫中包含的數據3GB價值(約1萬個對象,給予或採取)。我花了數週時間來構建和優化我的sql連接和查詢。我能夠實現大約10ms的最大性能,從樹中的選定位置返回幾個節點。然後,我遇到了奇怪的查詢性能問題,只能通過重新構造索引和/或刪除和重新創建存儲過程來解決。我花了很多時間來維護該死的SQL數據庫,因爲我正在編寫我的應用程序的其餘部分。不好。 (哦,我應該提到,我有大約3年的SQL服務器實踐經驗,所以我絕不是新的遊戲)。
使用Couchbase
快進18個月。我現在使用Couchbase
(一個流行的nosql數據庫)。通過使用視圖和map/reduce,我能夠從CB獲得相同的功能。我花了一個星期讓我的CB部署正常運行。查詢查詢延時小於毫秒。最終用戶注意到性能的急劇增加。
底線
如果你有大量的數據,你會捉襟見肘找到的情況下SQL會附近的NoSQL數據庫架構的性能的任何地方,不管如何結構化或者是非結構化的數據。
感謝您分享您的經驗!是否在幾臺機器上分佈數據庫?我的理解是,MapReduce在單個機器上效率很低。 – user3187713
這個問題似乎是基於兩個或三個誤解。不幸的是,它們在時尚的NoSQL產品愛好者中都很常見。
首先信息(不是「數據」)從來沒有真正的非結構化。結構是我們查看數據以查看信息的透鏡。結構是數據有用的原因。其次,這些數據(文檔,圖像,混合內容)的通常引用的例子是以關係形式存儲的非常合適的候選。
第三,SQL!=關係。 NoSQL產品的基本原理是需要替代SQL。這是毋庸置疑的。不幸的是,NoSQL的提倡者傾向於將他們的想法基於一種誤解,即SQL DBMS的問題和侷限性是數據關係模型中固有的問題。這不是真的。一個強有力的例子可以說是最好的一種NoSQL數據庫管理系統將是一個關係之一。
非結構化數據不是圖像或文本文件。它是一組數據,其中一條記錄看起來不像另一條記錄。結構化數據假定記錄之間有共同的字段,添加圖像字段或文本字段是可以的,但它仍然只是一個字段。搜索文本會變得有問題,但是可以實現......非結構化將是一系列對問題的逐字文本回答,例如,您希望搜索常見模式(有多少人積極響應)。這種類型的搜索不是SQL的實力 – Sparky