如何在Apache Cassandra中建模关联数据?

时间:2015-10-28 14:45:50

标签: cassandra data-modeling cassandra-2.0 columnstore

我决定将Cassandra用于一个项目,在完成大量文档后,我仍然无法想象一种建模关联数据的好方法。

系统应该将数据存储为这些类型的类型实例。同时 types 可以通过自定义关联进行关联,这些关联定义实例之后如何关联。

有关更具体的示例,请考虑以下数据:

  • 协会 a1 a2 a3
  • 类型 t1 t2 t3
  • 实例 t1-i1 t1-i2 t2-i3 t3- i4 t3-i5 t3-i6

然后,用户可以定义类型可以关联的方式:

  • t1 - a1 - t2
  • t2 - a2 - t3
  • t3 - a3 - t3

以上将稍后定义实例如何关联:

  • t1-i1 - t2-i3 (基于 t1 - a1 - t2
  • t2-i3 - t3-i5 (基于 t2 - a2 - t3
  • t3-i5 - t3-i6 (基于 t3 - a3 - t3
  • t3-i6 - t3-i6 (基于 t3 - a3 - t3

以上几点注释:

  1. 2个类型
  2. 之间可能存在 n 关联
  3. 同一个类型 / 实例之间可能存在关联(上面的示例)
  4. types 之间的关联定义实例的关联方式
  5. 查询会是什么:

    1. 系统应该能够CRUD个别关联类型实例类型。
    2. 类型的关系。 (例如:GET /t-assoc/t1 - > [ t1 - a1 - t2 ])
    3. 关联类型的关系。 (例如:GET /t-assoc/t2/a1 - > [ t1 - a1 - t2 ])
    4. 与上述相同但具有完整的关系
    5. 例如关系(例如:GET /i-assoc/t1/t1-i1 - > [< t1 t1-i1 > - a1 - <的 T2 T2-I3 >])
    6. 关联实例的关系(例如:GET /i-assoc/t1/t1-i1/a1 - > [< t1 t1-i1 > - a1 - <的 T2 T2-I3 >])
    7. 与类型关联的关系(例如:GET /i-assoc/t1/t1-i1/a1/t3 - > [])
    8. 与上述相同,具有完整的关系
    9. 3。类似,只是返回实际相关类型而不是返回关系(例如:GET /types/t1/a1 - > [ t2 ])
    10. 类似于 7。,返回实例时(例如:GET /instance/t1/t1-i1/a1/t2 - > [< t2 t2-i3 ]&GT)
    11. 我有一些关于实现上述结构的迭代,但我在一个允许在单个查询中执行所有上述操作的结构中表示它是不成功的。这是CQL版本:

      CREATE TABLE association (
        bucket_id timeuuid,
        id text,
        data map<text,text>,
        PRIMARY KEY (bucket_id, id)
      );
      
      CREATE TABLE type (
        bucket_id timeuuid,
        id text,
        data map<text,text>,
        PRIMARY KEY (bucket_id, id)
      );
      
      CREATE TABLE instance (
        bucket_id timeuuid,
        type_id text,
        id timeuuid,
        data map<text,text>,
        PRIMARY KEY ((bucket_id, type_id), id)
      );
      
      CREATE TABLE type_association (
        bucket_id timeuuid,
        from_type_id text,
        association_id timeuuid,
        to_type_id text,
        reverse boolean,
        data map<text,text>,
        PRIMARY KEY (bucket_id, from_type_id, association_id, to_type_id, reverse)
      );
      
      CREATE TABLE instance_association (
        bucket_id timeuuid,
        from_type_id text,
        from_instance_id timeuuid,
        association_id timeuuid,
        to_type_id text,
        to_instance_id timeuuid,
        reverse boolean,
        data map<text,text>,
        PRIMARY KEY (bucket_id, from_type_id, from_instance_id, association_id,
          to_type_id, to_instance_id, reverse)
      );
      

      反向领域是能够从两个方向发现关系的黑客。这意味着我会将 t1 - a1 - t2 插入:

      1. T1-A1-T2-真
      2. T2-A1-T1-假
      3. 此实现不支持查询no:9和10.对于9,我需要执行2个查询,第二个查询是IN查询。这不是最佳选择,因为这些将是最常见的查询。

        对于允许在1个查询中执行上述内容的不同设计的任何建议?

        编辑:作为图形结构,这非常适合图形数据库。我试图在Cassandra解决这个问题。

1 个答案:

答案 0 :(得分:0)

图形数据库对于这个问题来说是一个更好的解决方案。基本上你自己尝试做的就是创建一个Vertex-Edge系统。 看看Aurelius的TitanDB。 http://thinkaurelius.github.io/titan/ ThinkAurelius最近被DataStax收购,他们目前正在将图形功能集成到DataStax的企业版中。

您可以将Titan配置为使用cassandra作为后端存储。如果您需要更多灵活性和更多功能来查询数据库,您还可以将其配置为使用solr或elastic作为搜索引擎。 TitanDB实际上是“唯一”的计算引擎,因此您可以直接在客户端使用它。它实现了Tinkerpop3堆栈,因此您可以将底层图形数据库更改为实现此堆栈的任何其他系统。你不会失去无主人的scalabiliy。