2015-06-02 49 views
1

我對NoSQL的概念有許多疑問。NoSql初學者夥計。數據設計和關係

我可以理解NoSQL數據如何存儲,但不知道如何推導出最佳方式以及如何分配數據。

例如,一個數據存儲。 如何存儲訂單? 選項A:

customers: [customer {data1, data2,..., orders: [{data1, products [{data1, data2, quantity,...}]}] 

選項B:

customer: [customer {data1, data2, Data3, ...}] 
orders: [{customerId, data1, products [{data1, data2, quantity}] 

選項C:

customer: [customer {data1, data2, Data3, ...}] 
products [{data1, data2, ...}] 
orders: [{customerId, data1, products [{productId, quantity}]}] 

的B和C選項有關係,但A重複多的信息。什麼是最好的策略?

謝謝。

回答

1

對於大多數nosql數據庫(鍵值,列和文檔;圖形數據庫是一個完全獨立的野獸),連接是昂貴的 - 可能甚至需要在應用程序代碼中實現。由於這個原因,最好將表格非規範化,優先選項A優於優於選項B的選項B.

有時候這樣做沒有意義:有時候一段數據足夠大,經常重複以至於非規範化會耗盡太多的磁盤空間(這很便宜,但肯定不是免費的),有時你需要最新最好的數據,在這種情況下,非規範化可能不合適,因爲更新可能需要很長時間才能傳播,有時候非規範化會過度,因爲你不經常需要數據。在這種情況下幾個你的選擇是:

  1. 如果數據很大,經常反覆,或者如果數據需要儘可能一致,或者如果你不需要的數據,很多時候,然後使用關係 - 這將比關係連接更昂貴,因爲它可能需要至少再往返一次數據庫,但是如果您只有一個或兩個關係和/或能夠執行批量查找對大多數/所有關係來說,查找成本應該仍然合理。
  2. 如果您需要最新的數據和/或數據經常更新,那麼您可以使用緩存來補充數據庫等。 Redis。這看起來像這樣:當你更新非規格化關係時(例如products),那麼你將新數據存儲在緩存中;當您檢索包含非規範化關係的記錄時(customers),您將檢查數據的較新版本是否在緩存中;在將非規範化關係傳播到所有記錄之後,將數據從緩存中移除。
  3. 如果你不經常需要這些數據,特別是如果你正在進行不頻繁的批量查詢,那麼你可以使用一個MapReduce查詢,它支持許多nosql數據庫,通常採用HadoopSpark的形式。請注意,如果你要做很多這樣的事情,那麼一定要選擇一個支持它的數據庫:HBaseCassandra將是不錯的選擇,而一些數據庫如Riak將支持MapReduce,但不會有它的一個特別好的實現。