2015-01-12 55 views
1

我是新來卡桑德拉和嘗試我的應用程序遷移從MongoDB的卡桑德拉如何爲Cassandra數據庫(遷移)建模mongodb集合?

我有以下集合MongoDB中

PhotoAlbums 
[ 
    {id: oid1, title:t1, auth: author1, tags: ['bob', 'fun'], photos: [pid1, pid2], views:200 } 
    {id: oid2, title:t2, auth: author2, tags: ['job', 'fun'], photos: [pid3, pid4], views: 300 } 
    {id: oid3, title:t3, auth: author3, tags: ['rob', 'fun'], photos: [pid2, pid4], views: 400 } 
    .... 
] 

Photos 
[ 
{id: pid1, cap:t1, auth: author1, path:p1, tags: ['bob','fun'], comments:40, views:2000, likes:0 } 
{id: pid2, cap:t2, auth: author2, path:p2, tags: ['job','fun'], comments:50, views:50, likes:1, liker:[bob] } 
{id: pid3, cap:t3, auth: author3, path:p3, tags: ['rob','fun'], comments:60, views: 6000, likes: 0 } 
... 
] 

Comments 
[ 
    {id: oid1, photo_id: pid1, commenter: bob, text: photo is cool, likes: 1, likers: [john], replies: [{rep1}, {rep2}]} 
    {id: oid2, photo_id: pid1, commenter: bob, text: photo is nice, likes: 1, likers: [john], replies: [{rep1}, {rep2}]} 
    {id: oid3, photo_id: pid2, commenter: bob, text: photo is ok, likes: 2, likers: [john, bob], replies: [{rep1}]} 
] 

查詢:

  • 查詢1:顯示一個熱門專輯列表(根據喜歡的數量)

  • 問題2:顯示討論最多的專輯列表(基於 評論數)

  • 查詢3:顯示:上 用戶的頁面

  • 查詢4顯示給定作者的所有專輯列表所有的照片和所有評論專輯 (拉專輯的細節,在 相冊中所有照片的顯示照片縮略圖,顯示所選照片的​​所有評論

  • 問題5:展示基於標籤的 相關專輯列表的當前專輯

鑑於上述模式和要求,我應該如何在Cassandra中對此進行建模?

回答

1

因爲我有卡桑德拉和蒙戈的經驗,所以我會在這個問題上採取行動。這裏棘手的部分是,MongoDB允許對索引和查詢進行非常寬鬆的限制。卡桑德拉在這方面有一個更復雜的模型,但如果創建正確,應該快速執行。此外,在照片或相冊中統計喜歡/評論/評論也會變得棘手,因爲您需要使用Cassandra的counter類型(這有其自身的挑戰)。

免責聲明:其他人可能會以不同方式解決這些問題。如果我的第一次嘗試沒有執行,我可能會選擇以不同的方式解決它們。但這就是我要開始的。

爲了滿足查詢3我將創建一個查詢表叫PhotoAlbumsByAuthor和查詢它是這樣的:

CREATE TABLE PhotoAlbumsByAuthor (
photoalbumid uuid, 
title text, 
author text, 
tags set<text>, 
photos set<uuid>, 
PRIMARY KEY(author,title,photoalbumid) 
); 

> SELECT * FROM photoalbumsbyauthor WHERE author='Malcolm Reynolds'; 

將返回用戶馬爾科姆·雷諾茲已經創建的所有專輯,由title排序(標題是第一個集羣密鑰)。

對於查詢4我將創建註釋爲user defined type(UDT):

CREATE TYPE yourkeyspacename.comment (
commenter text, 
commenttext text 
); 

然後,我會創建一個查詢表叫PhotosByAlbum和查詢它是這樣的:

CREATE TABLE PhotosByAlbum (
photoalbumid uuid, 
photoid uuid, 
cap text, 
auth text, 
path text, 
tags set<text>, 
comments map<uuid,frozen <comment>>, 
PRIMARY KEY(photoalbumid,photoid) 
); 

> SELECT * FROM PhotosByAlbum WHERE photoalbumid=a50aa80a-8714-44b4-9b97-43ec4b13daa6; 

當你在這張表上添加一條評論,地圖的uuid鍵是紀念版。通過這種方式,您可以快速獲取應用程序端的所有密鑰和/或值。無論如何,這將返回給定的相片的所有照片以及任何評論。

我會解決查詢5以類似的方式,通過創建一個查詢表(你應該注意到現在的模式)呼籲PhotoAlbumsByTag和查詢它是這樣的:

CREATE TABLE PhotoAlbumsByTag (
tag text, 
photoalbumid uuid, 
title text, 
author text, 
photos set<uuid>, 
PRIMARY KEY(tag,title,photoalbumid) 
) 

SELECT * FROM PhotoAlbumsByTag WHERE tag='family'; 

這將返回所有帶有「家庭」標籤的相冊。請注意,這是上面使用的tags set<text>的非規範化結構,這意味着相冊在其包含的每個標記中都會有一個條目。我考慮過可能重複使用以前的查詢表中的一個,並在第二索引tags set<text>(因爲Cassandra現在允許索引集合),但二級索引通常不會很好。而且您仍然必須對當前相冊中的每個標籤執行查詢(使用SELECTIN關鍵字也被稱爲性能不佳)。

對於前兩個問題,我會創建特定表來存儲喜歡/意見/評論數是這樣的:

CREATE TABLE PhotoCounters (
photoid uuid, 
views counter, 
comments counter, 
likes counter, 
PRIMARY KEY (photoid) 
); 

當使用counter類型,卡桑德拉要求主鍵和計數器是該表中的唯一列(不能將計數器與非計數器列混合)。而且我還會使用Hadoop或Spark以OLAP方式處理這些離線查詢/報告。希望這可以幫助。