Scala + Cassandra + Phantom。为同一实体建模多个表

Scala + Cassandra + Phantom. Modeling Multiple Tables for Same Entity

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

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 为所有四个 table 实现 CRUD 操作。

有什么方法可以使用 Scala+Phantom 来实现我的存储库,而无需 CRUD 操作的代码重复或一些减少重复的良好实践?

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

现在,重复是前进的方向,但你的工作非常有限,因为你可以在大多数情况下复制粘贴并进行最少的更改。它不是 100% 理想的,但它仍然比任何其他选项都有很大的改进。

好吧,正如@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