2014-12-03 82 views
9

我讀到,在nosql(例如cassandra)數據經常存儲非規範化。例如見SO回答或這website卡桑德拉反規範化數據模型

一個例子是,如果你有員工和部門的一列的家人和你想執行一個查詢:select * from Emps where Birthdate = '25/04/1975' 然後,你必須做一個列族birthday_Emps並存儲每個員工爲一列的ID。因此,您可以查詢生日_Emps家庭關鍵字'25/04/1975',並立即獲得該日期出生的所有員工的ID。您甚至可以將員工詳細資料標準化爲birthday_Emps,以便您立即擁有員工姓名。

這真的是這樣做嗎?

  1. 每當員工被刪除或插入時,您將不得不從employee_Emps中刪除員工。在另一個例子中,有人甚至說,有時候你有一種情況,某個表中的某個刪除需要在其他表中刪除100個。這真的很常見嗎?

  2. 在應用程序代碼中進行連接是否很常見?你有軟件,允許你創建預先編寫的應用程序來連接來自不同查詢的數據嗎?

  3. 是否有處理這些數據模型問題的最佳實踐,模式等?

回答

8

大多數情況下,「採用基於查詢的數據建模方法」確實是最好的方法。

  1. 這仍然是一個好主意,因爲查詢時間的速度使它值得。是的,有更多的清理工作要做。我不必從其他專欄中執行100次刪除操作,但偶爾會有一些複雜的清理工作要做。但是,無論如何,你不應該在Cassandra中做大量的刪除操作(反模式)。

  2. 否。客戶端JOIN與分佈式JOIN一樣糟糕。整個想法是創建一個表來爲每個特定的查詢返回數據...非規範化和/或複製...因此否定完全需要進行JOIN。這是一個例外,如果您正在運行OLAP查詢進行分析,則可以使用Apache Spark之類的工具執行臨時分佈式JOIN。但絕對不是你想要在生產系統上做的事情。

  3. 幾篇文章,我可以推薦:

+1

Btw。更新所有非規範化數據是否是手動過程?或者這可以通過cassandra自動完成? – Stefan 2014-12-05 11:05:54

+1

@Stefan這是非規範化模型的缺點,因爲沒有參照完整性。因此,您需要調整您的DAO以修改更新中的多個表。 – Aaron 2015-01-16 15:38:43