【问题标题】:Dealing with one-to-many in Cassandra在 Cassandra 中处理一对多
【发布时间】:2018-01-02 12:55:49
【问题描述】:

鉴于以下简化的域模型:

火车之旅

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

旅程驿站

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

有了这个关系:

  • 1 Train Journey 有 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 世界很陌生。

【问题讨论】:

  • 您如何处理历史数据 - 您是否保留“旧旅程”?你每天有多少趟旅程?
  • 一天几万。过去的旅程是可忽略的,它们将被单独跟踪。假设我们谈论的是 7 天的数据,每天有 3000 次行程。
  • 还有多少站?
  • 首先:感谢您的时间和兴趣,Alex!我说的是每次行程 2-100 个站点。

标签: cassandra nosql domain-model


【解决方案1】:

首先,它可能不是最优化的解决方案(需要对分区大小等进行一些计算)。如果您可以使用 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&lt;uuid&gt;,但它可以更好地建模为用户定义的类型,因此您可以包含站点姓名和其他信息。

您的代码还应该为特定火车沿途的每个车站生成一个条目。

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

【讨论】:

  • TTL 到期是不可能的,但我可以在每次读取时处理旧数据并将其删除。我会尝试调整您的解决方案并计算分区大小。
  • 不必在每次读取时都像按范围搜索一样处理它,那么这些数据将不可见。您可以通过 cron 设置定期批量清理数据,例如
  • 没那么容易,主要是上面的领域模型被大大简化了。例如,有多个出发时间(计划的、估计的、验证的……),这些时间会更新,这将导致插入。范围搜索仍将包括旧数据。我需要多考虑一下,我已经害怕潜在的数据量了。
  • 但是你真的需要 Cassandra 来处理这么多的数据吗?
  • 好问题 :) 我仍在评估 Cassandra 是否是完成这项任务的好选择。当前的关系方法 (Oracle) 已达到此类查询的限制(全部连接)。
猜你喜欢
  • 1970-01-01
  • 2016-10-22
  • 2017-09-26
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2014-04-03
相关资源
最近更新 更多