为实时和所有搜索建模 Cassandra 数据结构?
Modelling Cassandra Data Struncture for both real-time and search from all?
我的项目同时提供实时数据和过去的数据。它像提要一样工作,因此它通过套接字显示实时数据,通过 REST api 显示过去的数据(如果向下滚动)。为了高效地获取实时数据,我将日期设置为分区键,将时间设置为聚类键。对于实时服务,我觉得这个数据结构建模的很好。但我还必须获得有限数量的最新数据(如分页),如果需要,它们应该能够显示整个数据。要通过 REST api 调用提供最近 0~20 / 20~40 / 40~60 等数据,我的数据服务服务器必须记住它之前显示的内容,以连续加载接下来的 20 个数据,作为书签。如果它是 SQL,我会使用 ID 或页面和偏移量,但我不能用 Cassandra 做到这一点。所以我尝试了:
SELECT * FROM examples WHERE date<='DATEMARK' AND create_at < 'TIMEMARK' AND entities CONTAINS 'something' limit 20 ALLOW FILTERING;
但是由于日期是分区键,我不能使用比较运算>, <。过去的数据可以在离现在很远的地方创建。
我可以用Cassandra满足我的实时+过去需求吗?我想知道我是否必须制作另一个数据库来访问过去的数据。
是的,你可以,但你必须改变你的思维方式,像 NoSQL 模式一样思考,在这种情况下,你可以以重复的方式保存你的数据,并使用另一个分区键和簇列将你的数据保存在其他 table满足您的需求。
我们一直在广泛使用 Cassandra 来显示实时 + 过去的数据。我请求您不要在 Cassandra 中使用 allow filtering 选项,因为这不是一个好习惯。尝试正确制作您的模式,这样您就不需要跳列。假设您有一个架构:
Created_date | Created_time | user_id |国家 |名称 | Activity
在此架构中,您正在考虑将 Created_date、created_time、user_id 国家/地区作为主键,但您想要特定国家/地区的 user_id。在这种情况下,即使您已将 Country 列视为主键,您也无法查询:
"SELECT * from table where Created_date='2020-02-14' and Country ='india' allow filtering ";
如果您以这种模式进行查询,您将丢失结果集中的数据,并且在处理大数据时会出错。或者您将使用不建议的允许过滤选项。因此,您需要更改架构的结构。
Created_date |国家 |城市 | Created_time | user_id |名称 | Activity
"SELECT * from table where created_date='2020-02-14' and country='india'";
使用这种结构会给你一个非常一致的结果,你永远不会遇到任何错误。假设您想获取最近 7 天的所有数据。在这种情况下,使用循环并遍历每一天的结果并将其存储到某个数据结构中。希望你明白。
我的项目同时提供实时数据和过去的数据。它像提要一样工作,因此它通过套接字显示实时数据,通过 REST api 显示过去的数据(如果向下滚动)。为了高效地获取实时数据,我将日期设置为分区键,将时间设置为聚类键。对于实时服务,我觉得这个数据结构建模的很好。但我还必须获得有限数量的最新数据(如分页),如果需要,它们应该能够显示整个数据。要通过 REST api 调用提供最近 0~20 / 20~40 / 40~60 等数据,我的数据服务服务器必须记住它之前显示的内容,以连续加载接下来的 20 个数据,作为书签。如果它是 SQL,我会使用 ID 或页面和偏移量,但我不能用 Cassandra 做到这一点。所以我尝试了:
SELECT * FROM examples WHERE date<='DATEMARK' AND create_at < 'TIMEMARK' AND entities CONTAINS 'something' limit 20 ALLOW FILTERING;
但是由于日期是分区键,我不能使用比较运算>, <。过去的数据可以在离现在很远的地方创建。
我可以用Cassandra满足我的实时+过去需求吗?我想知道我是否必须制作另一个数据库来访问过去的数据。
是的,你可以,但你必须改变你的思维方式,像 NoSQL 模式一样思考,在这种情况下,你可以以重复的方式保存你的数据,并使用另一个分区键和簇列将你的数据保存在其他 table满足您的需求。
我们一直在广泛使用 Cassandra 来显示实时 + 过去的数据。我请求您不要在 Cassandra 中使用 allow filtering 选项,因为这不是一个好习惯。尝试正确制作您的模式,这样您就不需要跳列。假设您有一个架构:
Created_date | Created_time | user_id |国家 |名称 | Activity
在此架构中,您正在考虑将 Created_date、created_time、user_id 国家/地区作为主键,但您想要特定国家/地区的 user_id。在这种情况下,即使您已将 Country 列视为主键,您也无法查询:
"SELECT * from table where Created_date='2020-02-14' and Country ='india' allow filtering ";
如果您以这种模式进行查询,您将丢失结果集中的数据,并且在处理大数据时会出错。或者您将使用不建议的允许过滤选项。因此,您需要更改架构的结构。
Created_date |国家 |城市 | Created_time | user_id |名称 | Activity
"SELECT * from table where created_date='2020-02-14' and country='india'"; 使用这种结构会给你一个非常一致的结果,你永远不会遇到任何错误。假设您想获取最近 7 天的所有数据。在这种情况下,使用循环并遍历每一天的结果并将其存储到某个数据结构中。希望你明白。