鉴于以下简化的领域模型:
列车行程
旅程站
通过这一关系:
对于此查询要求:
这个查询应该如何在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世界非常陌生。
发布于 2018-01-02 20:31:57
首先,它可能不是最优的解决方案(需要对分区大小等进行一些计算)。如果您可以使用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>,但可以更好地将其建模为用户定义的类型,这样您就可以包含站点名称和其他信息。
您的代码还应该生成一个条目,为每个车站沿线的旅程,为特定的火车。
我建议在DS220 (数据建模)课程上学习DataStax学院。
https://stackoverflow.com/questions/48061424
复制相似问题