首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在卡桑德拉与一对多的人打交道

在卡桑德拉与一对多的人打交道
EN

Stack Overflow用户
提问于 2018-01-02 12:55:49
回答 1查看 477关注 0票数 3

鉴于以下简化的领域模型:

列车行程

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

旅程站

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

通过这一关系:

  • 1列车旅程有n个旅程站

对于此查询要求:

  • 在一个给定的车站,的所有列车行程,包括所有的旅程站,在给定的时间范围内离开。

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

我在想这样的事情:

代码语言:javascript
复制
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世界非常陌生。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-02 20:31:57

首先,它可能不是最优的解决方案(需要对分区大小等进行一些计算)。如果您可以使用TTL将“旧”数据过期,那么我想使用以下内容:

代码语言:javascript
复制
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>,但可以更好地将其建模为用户定义的类型,这样您就可以包含站点名称和其他信息。

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

我建议在DS220 (数据建模)课程上学习DataStax学院

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48061424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档