我即将在 Lift 框架中开始我的第一个项目,我必须决定选择哪个持久性库。我即将使用关系后端,因此 Mapper 和 Record 都可以发挥作用。
在 Mapper 的情况下——我最想念的是控制发送到 RDBMS 的查询的能力——尤其是当涉及到更复杂的查询时,这些查询将通过 SQL 中的连接、聚合等来解决。举个例子——让我们有以下两个实体:
class BaseProduct extends LongKeyedMapper[BaseProduct] with IdPK {
// some fields
}
object BaseProduct extends BaseProduct with LongKeyedMetaMapper[BaseProduct]
class MyProduct extends LongKeyedMapper[MyProduct] with IdPK {
// some fields
object base extends MappedLongForeignKey(this, BaseProduct)
}
object MyProduct extends MyProduct with LongKeyedMetaMapper[MyProduct]
哪里MyProduct
是BaseProduct
实体的专业化之一。这些实体之间显然存在一对一的关系。然而,我想出的最好的可能性来查询确切MyProduct
的信息BaseProduct
是这样的查询:
MyProduct.findAll(PreCache(MyProduct.base))
哪个发出两个查询(此外,我恐怕无法控制MyProduct
要选择的实体的哪些字段。
对于 Mapper 库来说已经够糟糕了。我对 Record/Squeryl API 的主要担忧是它缺少Proto
Mapper API 周围存在的所有这些类。是否有接近这些类的记录功能的东西?是否可以访问 Squeryl 中的数据库特定功能(例如 PostgreSQL 中的几何查询)?
这些层中的任何一个还有其他优点和缺点吗?或者,如果我想对与数据库的通信进行适当的类型安全封装,并且可以对查询进行适当的控制,是否还有其他值得关注的抽象层(我习惯于直接使用 PHP 中的 PDO 层发出查询 - 我不想要这样的直接查询界面,但控制查询的可能性会很大)与 Lift 框架的集成绝对是一个优势。
谢谢!