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

mav*_*ein 4 scala playframework playframework-2.0 slick slick-2.0

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

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){...}
Run Code Online (Sandbox Code Playgroud)

这个模型代表什么?

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

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

我的问题:

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

Plz注意: 是的,我没有代码可以显示我尝试过的内容,但是现在我需要一些方向来寻找.目前我不知何故失去了:-)

cvo*_*ogt 5

光滑并没有克服物体 - 关系阻抗不匹配,它避免了它.答案如何在Slick中建模它基本上是如何在关系模型(而不是ORM)中最好地建模.Slick在SQL之上添加的是类型安全,scala语义和可组合性,即能够编写可以重用的函数和代码片段的能力.如果你真的需要继承,你必须自己映射,但Slick的可组合性可以帮助你减轻它的痛苦.例如,有一个kindrole列,告诉你它是什么.然后执行单表继承并为<>Slick中的映射运算符提供一个函数,该函数生成正确的子类.或者进行类表继承,加入所有内容并执行相同的操作.或者写一个函数,你可以给kind它一个,它只进行必要的连接.您甚至可以将它放在库中并将其放在github上以供其他人重复使用:).