【问题标题】:One Cassandra row to store a complex aggregate root model, is this posssible?一个 Cassandra 行来存储一个复杂的聚合根模型,这可能吗?
【发布时间】:2015-09-14 07:45:53
【问题描述】:

我熟悉(在新手级别)使用“宽行”和复合键/列的概念进行一对多建模)。

例如CREATE TABLE(A text, B text, C text static, D text, PRIMARY KEY ((A),B));

这将使 Cassandra 将数据存储在宽行中,因此可以使用一对多模型。这篇文章解释得很好:

http://www.ipponusa.com/blog/modeling-data-with-cassandra-what-cql-hides-away-from-you/

现在,假设我想将数据建模为聚合根,以采用 Eric Evans 域驱动设计概念,围绕该聚合根创建事务边界。一个例子:

一个订单有订单项目,这可以使用上面提到的 Cassandra 的复合键/列,使用开箱即用的“宽行”概念轻松建模。在这个模型中,我可以将客户信息、付款信息,当然还有订单商品作为“一对多关系”,全部存储在 Cassandra 行中。

但是,如果我希望聚合根比这更复杂一点怎么办?存储在一个 Cassandra 行中的聚合根具有两个不同的一对多“关系”,再举一个例子:

对象 A 有很多 B,A 也有很多 C。是否可以在 Cassandra 中使用组合键/列的“宽行”概念来表示这一点,并将这样的“聚合根”存储在一行中,然后能够履行“交易边界”合同?

【问题讨论】:

    标签: cassandra one-to-many cql aggregateroot nosql


    【解决方案1】:

    我不熟悉 Eric Evans 域驱动设计概念,但您可能想了解 Cassandra 中的集合类型(即集合、列表和映射)。它们允许您在一行中表达多个一对多关系。

    您可以创建用户定义的类型(即数据字段的结构),然后在集合中使用它们。这允许您在单行中创建一个小数据库,并且是一种解决在 Cassandra 中没有连接的方法。

    例如,请参阅this

    【讨论】:

    • 所以我假设您对我的问题的回答是否定的,使用复合键/列吗?不过,您的回答很有趣,因为我自己也想到了这一点。但是,我认为这种带有 UDT 的集合/列表是有限制的。不可能只搜索 UDT 上的单个字段,必须搜索所有字段才能在 where 子句中找到匹配项。
    • 这个链接讨论了这个限制,因此我想知道是否可以使用“宽行”来做到这一点。 stackoverflow.com/questions/29012661/…
    • 如果您想使用分区(也称为宽行)而不是集合,那么您可能会查看多个表,其中每个表使用您想要查询的不同集群列。如果你走这条路,那么物化视图可能会帮助你创建额外的表作为视图。
    • 好的,谢谢吉姆!这看起来很有趣。有了这个,我可能不得不放弃“一行中的复杂数据模型”的想法,以维护 Evans 在域驱动设计中提到的“ACID”“事务边界”。自从我看到 Martin Fowler 的网络研讨会后,我进入了这个轨道,他在一行中提到了 nosql 和聚合根来拯救以完成“ACID”事务。猜猜多个一对多是不可能的?
    • 好吧,我不确定您为什么觉得需要 ACID 事务或需要在集合中进行广泛的搜索功能。这些特性是传统 RDBMS 系统的优势,但在许多情况下,它们实际上并不是必需的,可以在分布式模型中解决。
    猜你喜欢
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2019-02-13
    • 2015-12-14
    • 1970-01-01
    • 2010-12-03
    • 2019-08-07
    • 1970-01-01
    相关资源
    最近更新 更多