【问题标题】:How to represent this mongodb collection's row into cassandra supercolumnfamily/columnfamily如何将此 mongodb 集合的行表示为 cassandra supercolumnfamily/columnfamily
【发布时间】:2014-09-17 20:25:30
【问题描述】:

我是 Cassandra 的新手。

我在一个使用 mongodb 的项目中工作,我发现使用 RDBMS 从不同年份学习非常简单。

现在在工作中我需要学习 cassandra ,即面向列而不是面向 mongodb 文档。

我阅读了有关 cassandra 的文章,但我的思想仍然是面向文档的。

我需要将一个非常通用的 mongodb 行可能模式表示为 cassandra 超列家族/列家族:

{
    "_id"  : ObjectId("mongodb-autogenerated-id"),
    key1   : "value1",
    key2   : "value2",
    ...
    keyN   : "valueN",
    keyN+1 : [{
                //array or object or value
             },{
                //array or object or value
             },
             ...
             {
                //array or object or value
             }],
    ...
    keyN+M : //array or object or value
}

谁能解释一下与 columnfamily 和 supercolumnfamily 的真正区别,不是简单的例子,而是一个真实的例子?

谢谢!

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    由于性能原因(不仅是),不推荐使用超级列。 在旧数据模型中,CF 可以是 Column 类型或 SuperColumn 类型。 SuperColumn 只不过是由键标识的列的集合。

    所以,使用 json 表示数据

    CF数据

    { 
      "RowKey": {"col1":"col1_val", "col2":"col2_val", .... "colX":"colX_val" }
    }
    

    在java中应该是:

    Map<String, Map<String, T>>
    

    SCF 数据

        { 
          "RowKey": { 
               "sc1_key": {"col1":"col1_val", "col2":"col2_val", .... "colX":"colX_val" },
               "sc2_key": {"col1":"col1_val", "col2":"col2_val", .... "colX":"colX_val" },
               ...
               "scX_key": {"col1":"col1_val", "col2":"col2_val", .... "colX":"colX_val" },
        }
    

    在java中应该是:

    Map<String, Map<String, Map<String, T>>
    

    但是 SCF 过去常常使用不良数据模型,即使您需要一小部分列,也必须对整个超级列进行反序列化。现在 SuperColumns 已被“宽行”取代,您可以使用复合主键获取它们。

    我对 MongoDB 知之甚少,玩游戏不过 10 分钟。 AFA 你的文档在 mongo 中,如果我没记错的话,你可以使用文档中的任何键执行任何查询,你可以将它们与逻辑运算符组合等等。

    在 cassandra 中这是不可能的,您可以做的最好的事情是使用“面向查询的数据模型”,编写您在数据库上执行的所有可能的查询,并在此基础上为您的数据建模。

    this 帖子中,您可以找到一些关于数据建模的技巧和有用的链接

    HTH, 卡罗

    【讨论】:

    • 所以你认为最好重新设计我的模型以便使用 cf 在 cassandra 中拥有一个键空间?
    • 绝对......您应该分析您对数据执行的所有查询,以便了解如何对数据建模。查询越多,键空间中的表就越多。
    • 较新的模型设计可能会引入多个 cf。你认为这是一种好的做法还是更像 rdbms?
    • 具有非规范化和多个 cf 是常态。例如:我有一个应用程序存储公司用户制作的 cmets。公司位于不同的城市,我必须执行诸如“获取所有用户 cmets”、“获取该公司的所有 cmets”、“获取该城市公司的所有 cmets”之类的查询。每个查询都应返回按时间排序的 cmets。在我的架构中不存在 COMMENTS 表,我有 3 个 TABLES USER_COMMENTS、COMPANY_COMMENTS、CITY_COMMENTS,每一个都回答一个特定的查询。 HTH,卡洛
    • 好的!明白了!!!我需要设计查询并在模型之后!谢谢卡罗!!! :)
    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2013-06-30
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多