我有一个数据结构来存储不同的区域/位置,区域是城市的一部分,城市是州的一部分,州是国家的一部分。
要查询的几个用例是
U1:给定一个位置,获取城市,州,国家。U2:给定一个国家,州得到城市,地区的列表
我知道要存储在 cassandra 中的数据应该针对读取路径进行优化。
U1 的键是 {位置、城市、州、国家}
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)
-- 位置是分区键,(国家、州、城市(是聚类列(您可以运行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(,您肯定需要考虑一些额外的问题,但我怀疑您描述的表格是否经常更新,或者国家/地区会有极高的基数。
所以......综上所述,考虑使用两个表,在第一种情况下,位置作为分区键,在第二种情况下,国家/地区作为分区键。还要考虑仅使用第一个索引,并在国家/地区创建二级索引。后面的选项可能更容易维护,但它不会那么快。不过,似乎确实是二级索引合理的那种问题。 我认为这最终取决于您的延迟要求。
这是正确的建模方法,您可以使用记录的批处理一次更新两个表。这是非常标准的建模。--Ryan Svihla - 解决方案架构师 - datastax