我有一个数据结构来存储不同的区域/位置,区域是城市的一部分,城市是州的一部分,州是国家的一部分。
要查询的几个用例是
U1:给定一个位置,获取城市、州、国家。U2 : 给定一个国家,州获得城市,地区的列表
我知道要存储在 cassandra 中的数据应该针对读取路径进行优化。
U1 的键是 {location, city, state, country}
U2 的键是 {国家、州、城市、位置}
想知道除了将值存储在两个列族中之外是否存在更好的方法
我有一个数据结构来存储不同的区域/位置,区域是城市的一部分,城市是州的一部分,州是国家的一部分。
要查询的几个用例是
U1:给定一个位置,获取城市、州、国家。U2 : 给定一个国家,州获得城市,地区的列表
我知道要存储在 cassandra 中的数据应该针对读取路径进行优化。
U1 的键是 {location, city, state, country}
U2 的键是 {国家、州、城市、位置}
想知道除了将值存储在两个列族中之外是否存在更好的方法
好的,所以你要做的第一件事就是从你想回答的问题开始。你做到了,我认为你基本上是在正确的轨道上......但你可能需要调整一些事情。
要开始使用,请务必查看这篇文章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 集群中的哪个节点实际拥有数据。如果定义了聚类列,则基本上确定了排序顺序。它们还会影响您可以使用哪种范围查询。
综上所述,您的桌子基本上有两个问题:“给定一个国家……”和“给定一个位置……”
因此,在这些情况下,您可能需要考虑看起来像
(location, country, state, city)
-- location 是分区键,(country, state, city) 是集群列(你可以运行SELECT * FROM table WHERE location = X and country = Y
,但你不能SELECT * FROM table WHERE location = X and city = Y
使用这样的索引运行......看看http://www.datastax.com/文档/cql/3.0/cql/cql_reference/select_r.html?scroll=reference_ds_d35_v2q_xj__filtering-data-using-where如果这对您没有意义)
并且(country, state, city, location)
-- 这里的 country 是分区键, (state ,city, location) 是聚类列
现在,所有这一切都说明了,您可能能够仅使用第一个表并在国家/地区创建二级索引。这当然似乎是可能的,尽管它不会像使用两个表那样快。对于二级索引,您肯定还需要考虑一些额外的问题(例如http://www.datastax.com/documentation/cql/3.0/cql/ddl/ddl_when_use_index_c.html)但我怀疑您的表是否描述经常更新,或者国家/地区的基数非常高。
所以......所有这一切,考虑在第一种情况下使用两个表作为分区键,在第二种情况下使用国家作为分区键。还可以考虑仅使用第一个并在国家/地区创建二级索引。后一个选项可能更容易维护,但不会那么快。In 似乎确实是一种二级索引是合理的问题。我认为这最终取决于您的延迟要求。
这是建模的正确方法,您可以使用记录的批处理一次更新两个表。这是非常标准的建模。--Ryan Svihla - 解决方案架构师 - datastax