我有一个数据结构来存储不同的区域/位置,区域是城市的一部分,城市是一个州的一部分,州是国家的一部分。
要查询的几个用例是
U1:给定位置获取城市,州,国家。 U2:给定一个国家,州获得城市,地区列表
我理解存储在cassandra中的数据应针对读取路径进行优化。
U1的关键是{location,city,state,country}
U2的关键是{国家,州,城市,地点}
想知道除了在两个列族中存储值之外是否存在更好的方法
答案 0 :(得分:2)
好的,所以你要做的第一件事就是从你要回答的问题开始。你做到了,我认为你基本上是在正确的轨道上......但你可能需要调整一些事情。
要开始使用,请务必查看本文http://opensourceconnections.com/blog/2013/07/24/understanding-how-cql3-maps-to-cassandras-internal-data-structure/ Cassandra Cli正在折旧,但查看数据实际存储在数据库中的方式仍然很有用。
特别是,您要注意每个主键可能有两个部分:分区键和聚类列(例如http://www.datastax.com/documentation/cql/3.0/cql/cql_reference/create_table_r.html?scroll=reference_ds_v3f_vfk_xj__using-a-composite-partition-key)。
分区键确定Cassandra集群中的哪个节点实际上将拥有该数据。如果定义了聚类列,则基本上确定排序顺序。它们还会影响您可以使用的范围查询。
所有这些都说明,你的桌子基本上有两个问题:"给定一个国家......"和#34;给定一个位置......"
因此,在这些情况下,您可能需要考虑看起来像
的主键 (location, country, state, city)
- location是分区键,(国家,州,城市)是群集列(您可以运行SELECT * FROM table WHERE location = X and country = Y
,但无法使用类似的索引运行SELECT * FROM table WHERE location = X and city = Y
这个......看看http://www.datastax.com/documentation/cql/3.0/cql/cql_reference/select_r.html?scroll=reference_ds_d35_v2q_xj__filtering-data-using-where,如果这对你没有意义的话)
而(country, state, city, location)
- 此处国家/地区是分区键,(州,城市,位置)是群集列
现在,所有这些都表示,您可能只能使用第一个表并在国家/地区创建二级索引。这似乎是可能的,尽管它不会像使用两个表一样快。你肯定会考虑一些关于二级指数的问题(例如http://www.datastax.com/documentation/cql/3.0/cql/ddl/ddl_when_use_index_c.html),但我怀疑你所描述的表是经常更新还是国家的基数极高。
所以......所有这一切,考虑在第一种情况下使用两个带位置的表作为分区键,而在第二种情况下使用country作为分区键。还要考虑仅使用第一个并在国家/地区创建二级索引。后面的选项可能更容易维护,但它不会那么快。看起来似乎是二级索引合理的问题。我认为这最终取决于您的延迟要求。
答案 1 :(得分:0)
这是正确的建模方式,您可以使用已记录的批次一次更新两个表。这是非常标准的建模。 --Ryan Svihla - 解决方案架构师 - datastax