我想创建一个事件数据库。同一用户的事件将具有相同的用户ID。然后,我可以执行查询以检索已完成事件A和B但不是C的用户。
我看过Cassandra,但我不清楚我应该如何建模这些数据。
我想到的方法是:
数据库中的每个条目都获得一个唯一的ID(因为我认为Cassandra需要一个唯一的主键?),然后我有一列是我的用户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的所有用户,以及所有已完成B并为共同用户过滤的用户带入java?
这种方法听起来有可能并且是使用Cassandra的好方法吗?
是否有其他可能合适的开源分布式数据库?
感谢您的帮助!
答案 0 :(得分:1)
在" event_column"上使用二级索引您可以询问...WHERE event_column IN ('A', 'B')
,但不能像常规SQL那样执行NOT IN
子句。 (另见this answer)。
支持您的查询的数据库示例为MongoDB,其中$nin和$in分别与NOT IN (...)
和IN (...)
相似。 (MongoDB是一个文档数据库,其中Cassandra是一个列数据库。)
为了防止对所有文档进行完整扫描,如果只有少数文档包含您搜索的事件,请记住在events
属性上放置二级索引。