继承和多态关系是可能的吗/Slick是个好主意?



考虑以下我目前正在研究的简化域模型:

case class Product(val id : Long, val name : String, product : Option[Product], category : Option[ProductCategory])
case class Price(val id : Long, val amount : Double, val conditions : Seq[Condition])
trait Condition {
  def isTrue(product: Product):Boolean
}
case class ManufacturerNameCondition(val id : Long, val name : String){...}
case class DateCondition(val id : Long, val validFrom : Date, val validTo : Date){...}

这个模型代表什么?

它表示一个简单的价格服务,允许为一个产品或产品类别定义多个价格。产品的最终价格是通过检查所有匹配的价格及其相关条件来确定的。例如,可能有一个产品的正常价格和一个额外的价格,这个价格只在今天有效,因为它有一个dateconcondition。

我有什么问题?一个价格可能与多个条件相关联。每种情况可能是另一种类型。所以我问自己如何用Slick(=多态关系)来解决这个问题。基本上,我想有一个类似dao的接口,它可以获取价格以及相关的条件。

我的问题:

  1. 是否可以用Slick实现这个模型?(可能是)
  2. 多态关系:在《Slick》中解决这个问题是个好主意吗?Slick声称它想要克服对象关系的不匹配,在这里我有一种感觉,好像我试图用这个模型来对抗框架。Slick不能很好地配合这种面向对象的方法吗?我应该选择另一种方法吗?

请注意:是的,我没有代码来显示我所尝试过的,但现在我需要一些方向来寻找。目前我不知怎么丢失了:-)

Slick并没有克服对象关系阻抗失配,而是避免了它。如何在Slick中建模的答案基本上是如何在关系模型(而不是ORM)中最好地建模。Slick在SQL的基础上增加了类型安全、尺度语义和可组合性,也就是说,可以编写可以合理重用的函数和代码片段。如果您确实需要继承,您将不得不自己映射它,但是Slick的可组合性帮助您使它不会过于痛苦。例如,有一个kindrole列,它告诉你它是什么。然后进行单表继承,并向Slick中的<>映射操作符提供一个函数,生成正确的子类。或者进行类-表继承,连接所有内容并执行相同的操作。或者写一个函数,你可以给它一个kind,它只做必要的连接。你甚至可以把它放在一个库中,并把它放在github上供其他人重用:)。

最新更新