作为新手,面对Cassandra数据模型上的数据建模问题。我们计划使用Cassandra进行报告。在报告中,我们需要通过多个参数过滤数据。我们说我们有一个列族
Create table cf_data
(
Date varchar,
Attribute1 varchar,
Attribute2 varchar,
Attribute3 varchar,
Attribute4 varchar,
Attribute5 varchar,
Attribute6 varchar,
Primary Key(Date)
)
我们需要支持
之类的查询Select * from cf_date where date = '2015-02-02' and Attribute1 in ('asdf','assf','asdf') and Attribute1 in ('wewer','werwe') and Attribute2 in ('sdfsd','werwe') and Attribute3 in ('weryewu','ghjghjh')
我知道在查询列族时我们需要尊重主键限制。 Cassandra内部存储就像
一样SortedMap<String,SortedMap<Key,Value>>
NoSQL的工作原理是根据访问模式存储非规范化数据。如果我需要满足上述查询,我应该如何建模列族。从报告UI,用户可以选择Attribute1,Attribute2,Attribute3 ....等值作为下拉列表。一种选择可能是在Cassandra节点上使用Spark来支持SQL查询,但是像Cassandra预期的那样,列系列的模型更好。
任何指针??
答案 0 :(得分:1)
从Datastax CQL文档:
“在大多数情况下,建议不要在WHERE子句中使用IN。使用IN会降低性能,因为通常必须查询许多节点。”
如果您需要使用Spark来支持SQL查询,那么最好使用正确的SQL数据库。仅仅因为NoSQL是一种时尚,你不需要遵循它。并非所有数据都可以在所有NoSQL DB中高效建模。
另一个效率低下的选项是在没有属性本身的情况下进行查询,并在应用程序中对过滤进行编码,但存在响应中产生大延迟的风险。如果报告不是实时或接近实时创建的,那么你应该做得很好。