【问题标题】:Modeling Cassandra data with optional query params使用可选查询参数对 Cassandra 数据进行建模
【发布时间】:2017-09-10 15:06:50
【问题描述】:

我正在开发一个应用程序,它需要根据主键查询实体,并且可以选择一个或多个附加属性(目前为 3 个,但可能会随着时间的推移而增加)。我们正处于数据库建模阶段,并且有人提议在 Cassandra 中对数据进行建模。我是 NoSQL 的新手,在我一直在做的少量研究中,我不相信它是适合这项工作的工具,因此可以使用一些反馈。

我主要关心的是可选的查询参数。例如,如果需要查询(行键)制造商 = 'GM' 的所有汽车详细信息,那么在 Cassandra 中建模很简单。但是,如果需要根据制造商进行查询,可能是“年份”,也可能是“燃料类型”,也可能是“马力”……那么如何在不为所有不同查询排列构建由复合键组成的多个表的情况下对此进行建模参数?如果查询需求随时间变化,我们是否只是不断添加越来越多的表?

【问题讨论】:

    标签: cassandra modeling nosql


    【解决方案1】:

    在 NoSQL 的世界中,非规范化不是犯罪,而对于 Cassandra,避免创建索引甚至是一个好主意。

    Cassandra 确实针对快速写入进行了优化,这意味着创建冗余的“查找”表并写入多个表是可以的,但它会在应用程序端引入更多的麻烦。

    但是,为了高效读取,查询应该坚持一个分区,因为两个不同分区上的行可以存储在不同的节点上。这就是需要进行非规范化的原因。否则,您始终可以将二级索引用作一列或两列的反向查找机制,但它并不能很好地扩展。

    所以答案是肯定的,我们鼓励您随着需求的变化添加更多的表和列。 Cassandra,在表层、模式和 CQL 下是very much like a key-value database

    【讨论】:

      【解决方案2】:

      CREATE TABLE vehicles( manufacturer text, year int, fuel_type text, horse_power int, ..... more columns PRIMARY KEY(manufacturer, year, fuel_type, horse_power)

      上表将帮助您回答类似的查询

      1. SELECT * from vehicles where manufacturer = 'GM';
      2. SELECT * from vehicles where manufacturer = 'GM' and year = 2017;
      3. SELECT * from vehicles where manufacturer = 'GM' and year = 2017 and vehicle_type='petrol';
      4. 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

      【讨论】:

        猜你喜欢
        • 2016-08-20
        • 1970-01-01
        • 2018-01-15
        • 1970-01-01
        • 1970-01-01
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多