鉴于以下简化的域模型:
火车之旅
旅行站
有了这种关系:
使用此查询要求:
如何在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世界很新。
答案 0 :(得分: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<uuid>
,但它可以更好地建模为用户定义的类型,因此您可以包括电台名称和其他信息。
您的代码也应为特定列车的每个车站生成一个条目。
P.S。我建议在DataStax Academy上学习DS220(数据建模)课程。