在卡桑德拉处理一对多

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在卡桑德拉处理一对多相关的知识,希望对你有一定的参考价值。

鉴于以下简化的域模型:

火车旅行

  • id uuid
  • 火车名称字符串(一天内唯一)
  • 旅行日期
  • ...

旅程站

  • 站uuid
  • 到达时间戳
  • 出发时间戳
  • ...

有了这个关系:

  • 1次火车之旅有n个旅程站

有了这个查询要求:

  • 在指定时间段内,特定车站的所有列车行程,包括所有行车站。

这个查询应该如何在Cassandra中建模?

我在考虑这样的事情:

CREATE TABLE departures_by_station (
    date_of_yourney date,
    train_name varchar,
    station uuid,
    arrival timestamp,
    departure timestamp,
    primary key((date_of_journey, station), train_name, departure)
);

SELECT * from departures_by_station 
WHERE date_of_journey = '2018-01-02' AND station = 'Paris' AND departure ...;

这不起作用,因为它会导致部分列车行程 - 除了请求的行程之外的所有行程站都缺失。更糟糕的是,到达和离开时间可能会经常变化。我无法使用新的启程时间更新此表,因为它是一个群集密钥。

任何想法或提示如何解决这个问题?我想我错过了一些基本的东西,但我对nosql世界很新。

答案

首先,它可能不是最佳解决方案(需要对分区大小进行一些计算等)。如果你可以使用TTL使“旧”数据到期,那么我想到了这样的事情:

CREATE TABLE departures_by_station (
   station uuid,
   departure timestamp,
   train_name varchar,
   arrival timestamp,
   statitions list<uuid>
   primary key(station, departure, train_name)
);

在这种情况下,您将拥有所谓的“宽”分区 - 每个旅程一个分区,并且因为您有离开作为群集密钥,您可以对其进行范围搜索。但是如果你过期了很多数据,那么你需要经常对表进行“修复”以摆脱逻辑删除(删除标记),因为这可能会影响读取性能。

此外,为了避免进行多次查找,您需要将有关所有工作站的信息放入每一行 - 我将其写为list<uuid>,但它可以更好地建模为用户定义的类型,因此您可以包含工作站名称和其他信息。

您的代码也应为特定列车的每个车站生成一个条目。

附:我建议在DataStax Academy上学习DS220(数据建模)课程。

以上是关于在卡桑德拉处理一对多的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

一对一,一对多,多对一,自关联

EF基础知识小记五(一对多多对多处理)

7.Mybatis的一对多,多对一处理

是啥导致卡桑德拉大排长龙?

如何在多片段活动中处理 onContextItemSelected?