我正在开发一个应用程序,它需要根据主键查询实体,以及可选的一个或多个附加属性(当前为3但可能随时间增加)。我们处于数据库建模阶段,并且已经建议对Cassandra中的数据进行建模。我是NoSQL的新手,在我一直在做的少量研究中,我不相信它是适合这项工作的工具,因此可以使用一些反馈。
我主要关心的是可选的查询参数。例如,如果需要查询(行键)制造商='GM'的所有汽车详细信息,那么在Cassandra中进行建模很简单。但是,如果需要根据制造商进行查询并且可能是'年'并且'mabye'燃料类型'并且可能是'马力'......那么如何在不构建包含用于所有不同查询排列的复合键的多个表的情况下对此进行建模PARAMS?如果查询要求随时间而变化,我们是否只是继续添加越来越多的表?
答案 0 :(得分:1)
在NoSQL的世界里,非规范化并不是一种犯罪,而对于Cassandra来说,避免创建索引甚至是一个好主意。
Cassandra真正针对快速写入进行了优化,这意味着创建冗余"查找"表格和写入几个很好,但它会引入更多令人头痛的应用程序方面。
但是,为了有效地阅读,查询应该坚持一个分区,因为两个不同分区上的行可以存储在不同的节点上。这就是非规范化需要发生的原因。否则,您始终可以在一列或两列上使用二级索引作为反向查找机制,但它并不能很好地扩展。
所以答案是肯定的,您鼓励在需求变更时添加更多表格和列。 Cassandra,在表面表,模式和CQL下是very much like a key-value database。
答案 1 :(得分:0)
CREATE TABLE vehicles(
manufacturer text,
year int,
fuel_type text,
horse_power int,
.....
more columns
PRIMARY KEY(manufacturer, year, fuel_type, horse_power)
上表将帮助您回答
等问题SELECT * from vehicles where manufacturer = 'GM';
SELECT * from vehicles where manufacturer = 'GM' and year = 2017;
SELECT * from vehicles where manufacturer = 'GM' and year = 2017 and vehicle_type='petrol';
SELECT * from vehicles where manufacturer = 'GM' and year = 2017 and vehicle_type='petrol' and horse_power = 750;
查看实体化视图,它可以帮助您创建多个表并更新它们https://www.datastax.com/dev/blog/new-in-cassandra-3-0-materialized-views