Cassandra 列族适用于多个用例好/坏
Posted
技术标签:
【中文标题】Cassandra 列族适用于多个用例好/坏【英文标题】:Cassandra column family for multiple usecases good/bad 【发布时间】:2014-12-12 06:03:59 【问题描述】:我有一个数据结构来存储不同的区域/位置,区域是城市的一部分,城市是州的一部分,州是国家的一部分。
要查询的几个用例是
U1:给定一个位置,获取城市、州、国家。 U2 : 给定一个国家,州得到城市,地区的列表
我了解存储在 cassandra 中的数据应针对读取路径进行优化。
U1 的键是 location, city, state, country
U2 的键是 country, state, city, location
想知道除了将值存储在两个列族中之外是否存在更好的方法
【问题讨论】:
【参考方案1】:好的,所以你要做的第一件事就是从你想回答的问题开始。你做到了,我认为你基本上是在正确的轨道上......但你可能需要调整一些事情。
首先,一定要看看这篇文章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/documentation/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 似乎确实是一种二级索引是合理的问题。我认为这最终取决于您的延迟要求。
【讨论】:
【参考方案2】:这是正确的建模方法,您可以使用记录的批处理一次更新两个表。这是非常标准的建模。 --Ryan Svihla - 解决方案架构师 - datastax
【讨论】:
以上是关于Cassandra 列族适用于多个用例好/坏的主要内容,如果未能解决你的问题,请参考以下文章