2015-08-14 91 views
1

我想創建一個事件數據庫。同一用戶的事件將具有相同的用戶ID。然後,我可以執行查詢來檢索已完成事件A和B但不是C的用戶。NoSQL數據庫可以容納以下數據結構?

我看了一下Cassandra,但我不清楚應該如何對這些數據進行建模。

我想到的辦法是:

數據庫中的每個條目獲得一個唯一的ID(?因爲我覺得卡桑德拉需要一個唯一的主鍵),然後我有一列是我的用戶ID,非唯一。然後,我可以自由地爲每個活動提供其他欄目,具體取決於與該活動相關的內容。所以我可能會有一些條目:

1,user1,event_column=registered,fname_column=James,lname_column=Mason 
2,user2,event_column=deleted 
3,user1,event_column=pageview,page_column=homepage 

等等。

然後我有點不清楚我將如何選擇已經完成A和B但不是C的用戶。我可以用一個查詢來做到這一點嗎?或者,我需要將所有已完成A的用戶引入到java中,然後是所有完成B併爲用戶共同篩選的用戶?

這種方法聽起來是否可行並且是使用Cassandra的好方法?

是否有其他的開源分佈式數據庫可能是合適的?

感謝您的幫助!

回答

1

使用「event_column」上的二級索引,可以詢問...WHERE event_column IN ('A', 'B'),但不能像傳統SQL那樣執行NOT IN子句。 (另見this answer)。

支持查詢數據庫的一個例子是MongoDB其中$nin$in分別類似於NOT IN (...)IN (...)。 (MongoDB是Cassandra是列數據庫的文檔數據庫。) 爲了防止對所有文檔進行完整掃描,請記住在events屬性上放置次要索引(如果只有少數文檔將包含您搜索的事件。

+0

謝謝你(OP,不同的帳戶)。我懷疑我們可能會在交叉目的下討論。以MongoDB爲例,我不想識別事件在(..)或不在(..)中的文檔。我想確定用戶,事件A確實有一個與它們相關的文檔,並且還有另一個文檔與事件B相關聯。我不認爲in()運算符會這樣做嗎?這更像是我認爲的子選擇,但我不確定MongoDB中的等價物是什麼,或者我是否必須在應用程序中處理它 - 或者也許使用MapReduce?再次感謝您的幫助 – user384842

+0

只是想補充一點,二手索引超過cassandra是一個非常糟糕的主意。 原因是,二級索引的元數據不在所有節點之間共享, 以及對於基於二級索引的每個查詢,每個節點都必須在其內部進行查詢。 因此,如果帶有主索引的查詢需要2個內部查詢,則使用二級索引查詢將需要查詢數量的cassandra節點。 –

相關問題