【问题标题】:Scala + Cassandra + Phantom. Modeling Multiple Tables for Same Entity斯卡拉 + 卡桑德拉 + 幻影。为同一实体建模多个表
【发布时间】:2015-09-08 16:44:31
【问题描述】:

在我的 Cassandra 键空间中,我有一个主报价表和三个相同表的副本,面向不同的查询参数,如下所示:

offer (primary key offer_id) (... some attributes)
offer_by_product (primary key product_id, offer_id) (... some attributes)
offer_by_seller (primary key seller_id, offer_id) (... some attributes)
offer_by_sku (primary key sku_id, offer_id) (... some attributes)

所有列都完全相同,只更改分区键和集群键,但我需要复制大量代码来使用 Scala+Phantom 对所有四个表实现 CRUD 操作。

有什么方法可以使用 Scala+Phantom 来实现我的存储库,而不需要为 CRUD 操作重复代码,或者有什么好的做法可以减少重复?

【问题讨论】:

  • 我认为你不会在这个问题上解决代码重复问题。也许是对象的一个​​特征?

标签: scala cassandra phantom-dsl


【解决方案1】:

如果没有复制,您目前无法逃脱。即将推出的 phantom 企业版具有自动代码生成和模式迁移功能,因此您将能够使用自动表直接从案例类定义生成所有 Cassandra 代码。

目前,重复是前进的方向,但您的工作非常有限,因为您可以大部分复制粘贴而只做很少的更改。它不是 100% 理想的,但与任何其他选项相比,它仍然是一个巨大的改进。

【讨论】:

    【解决方案2】:

    好吧,正如@flavian 已经说过的,你不能那样做,但我至少可以将对象提取成这样的特征。

    trait MyCommonModel[O <: CassandraTable[O, R], R] {
    
      var cassandra: O = _
    
      object commonField extends StringColumn(cassandra)
      ...
    
    }
    

    然后你可以在你的模型中这样使用:

    sealed class MyModel extends CassandraTable[MyModel, Model] with MyCommonModel[MyModel, Model]
    

    因此,您将从 CommonModel 继承所有对象。

    更新

    我创建了一个 github 项目来展示如何按照文档使用 phantom-dsl 在 scala 中对 cassandra 表进行建模。在这里查看。

    https://github.com/iamthiago/cassandra-phantom

    【讨论】:

      猜你喜欢
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 2015-10-19
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多