数据库建模Cassandra数据结构的实时和搜索从所有?

slmsl1lt  于 2021-06-10  发布在  Cassandra
关注(0)|答案(2)|浏览(407)

我的项目同时提供实时数据和过去的数据。它的工作原理类似于feed,所以它通过socket显示实时数据,通过restapi显示过去的数据(如果向下滚动)。为了有效地获取实时数据,我将日期设置为分区键,时间设置为聚类键。对于实时服务,我认为这个数据结构是很好的建模。但我还必须获得有限数量的最新数据(如分页),如果需要,这些数据应该能够显示整个数据。为了通过restapi调用服务最近的0~20/20~40/40~60等数据,我的数据服务服务器必须记住它之前显示的内容,以便连续加载下20个数据,作为书签。如果是sql,我会使用id或page&offset,但我不能用cassandra。所以我试着:

SELECT * FROM examples WHERE date<='DATEMARK' AND create_at < 'TIMEMARK' AND entities CONTAINS 'something' limit 20 ALLOW FILTERING;

但是由于date是分区键,所以我不能使用比较操作>,<。过去的数据可能会在很远的将来被创造出来。
我能用cassandra满足我的实时+过去的要求吗?我想知道我是否需要再做一个数据库来访问过去的数据。

d7v8vwbk

d7v8vwbk1#

是的,您可以,但是您必须改变您的思维方式,像nosql模式一样思考,在这种情况下,您可以以重复的方式保存数据,并使用另一个分区键和满足您需要的集群列将数据保存在其他表中。

lskq00tm

lskq00tm2#

我们已经广泛使用cassandra来显示实时+过去的数据。我请求您不要在cassandra中使用允许过滤选项,因为这不是一个好的做法。尝试正确地创建模式,这样就不需要跳转列。假设您有一个模式:
创建日期创建时间用户id国家名称活动
在这个模式中,您考虑将created\u date、created\u time、user\u id、country作为主键,但是您需要特定国家的user\u id。在这种情况下,即使您将country列视为主键,也不能像以下那样进行查询:
“从创建的表中选择日期=”2020-02-14“和国家=”印度“允许筛选”;
如果以这种模式进行查询,结果集中的数据将丢失,并且在处理大数据时会出错。或者您将使用不建议使用的“允许筛选”选项。因此,您需要更改模式的结构。
创建日期|国家|城市|创建时间|用户id |名称|活动
“从创建的表格中选择
日期='2020-02-14'和国家='india'”;使用这种结构将给你一个非常一致的结果,你永远不会面对任何错误。假设你想得到过去七天的所有数据。在这种情况下,使用循环遍历每天的结果,并将其存储到某些数据结构中。希望你能理解。

相关问题