2012-08-04 74 views
0

我對NoSQL商店(如Dynamo或Mongo等)的理解是,您應該根據非規範化和創建基於您將執行的查詢創建表的想法。這是在DynamoDB中創建表的正確方法嗎?

我在如何設置我的桌子上掙扎。

我確定了我想運行的查詢。

我翻譯這將是一個普通的SQL查詢到「純英語」

例如,我想運行一個查詢會轉化爲這樣:

「獲得date_x之間拍攝的所有照片和date_y當攝影師約翰下令由得票最多的」

既然不能做表連接,這就是我想出了:

photos 
{ 
    name, 
    url, 
    photographer, 
    date_created, 
    likes, 
    dislikes, 
    num_voters, 
    weighted_score 
} 

是個是正確的方法?

我喜歡,不喜歡,num_voters和weighted_score的原因是因爲我相信,每當用戶投票的照片,我需要更新「行」,並增加喜歡/不喜歡/ num_voters和重新計算weighted_score(使具有低多的選民高度評價的項目不會影響我的排行榜)

然而,

因爲我申請「過濾器」 - 我想一個鍵/值存儲像迪納摩不我想要的是?

另一方面的問題:比方說,我有一個攝影師表,我想刪除一個攝影師。這是我的責任,然後通過照片和刪除攝影師?再一次,因爲它是非關係的,我假設沒有級聯類型的功能?

由於

回答

1

DynamoDB是一個索引鍵值數據庫,目前僅允許定義一個主鍵以及爲每個表的範圍鍵。它可能不適合您的靈活查詢示例,因爲通過多個屬性進行搜索最終會做出non-indexed table scans

MongoDB是一個面向文檔的數據庫,它允許你定義多個索引,並且更適合你的用例。

例如:「獲取拍攝者在約翰大多數選票中所拍攝的所有在date_x和date_y之間拍攝的照片」。

db.photos.find({ 
    'photographer': 'john', 
    'created': { 
     $gte: ISODate("2012-07-01"), 
     $lte: ISODate("2012-07-05") 
    } 
}).sort({'votes': -1}); 

對於遞增計數器如喜歡/不喜歡/票號碼,請參閱Atomic Operations

對於非關係數據庫,不支持(或相關)級聯刪除是正確的。您可以通過刪除相關文檔來在應用程序層支持此邏輯。一些MongoDB驅動程序確實支持Database References (DBRefs)的概念,這對於提取相關文檔非常有用。使用DBRefs仍然會導致多個查詢,但可以成爲一個有用的幫手。

+0

非常感謝Stennie! – john 2012-08-05 06:39:06

相關問題