3

我有一个WorkspaceDocument实体,认为工作区可以包含零个、一个或多个文档。我的第一个建模方法是:

case class Workspace(name: String, documents: Seq[Document])

但这不会很好地扩展,因为我的工作区可能包含许多文档。幸运的是,我的业务需求允许我分别处理工作区和文档(从某种意义上说,当我有一个工作区时,没有理由或不变量迫使我考虑其中包含的所有文档)。

问题:我想知道:我将如何在SormWorkspace中建模,以便在两者之间建立链接,但不必加载工作区的所有文档?我想有一个存储库,它可以让我访问工作区的文档,并支持分页。)Document

case class Workspace(name: String)
case class Document(name: String, /* ... */)

trait WorkspaceRepository {
  def children(ws: Workspace, offset: Long, limit: Long)
}
4

1 回答 1

6

十分简单!您将它们定义为不相关的:

case class Workspace ( name : String )
case class Document ( ... )

然后,您选择一种您希望它们链接的方式。我看到两个。

变体 #1

case class WorkspaceDocuments 
  ( workspace : Workspace, documents : Seq[Document] )

并像这样获取工作区的所有文档:

Db.query[WorkspaceDocuments]
  .whereEqual("workspace", theWorkspace)
  .fetchOne()
  .map(_.documents)
  .getOrElse(Seq())

workspace在这种情况下,在实例声明中将属性指定为唯一是有意义的:

... Instance (
  entities = Set() +
             Entity[WorkspaceDocuments]( unique = Set() + Seq("workspace") )
  ...
)

变体 #2

case class WorkspaceToDocument
  ( workspace : Workspace, document : Document )

并像这样获取工作区的文档:

Db.query[WorkspaceToDocument]
  .whereEqual("workspace", theWorkspace)
  .whereEqual("document.name", "...") // ability to filter docs
  .fetch()
  .map(_.document)

第一个变体不允许您在查询中过滤文档(至少在 SORM v0.3.* 中),但由于能够在工作区上设置唯一约束,它应该在基于工作区的查询上表现更好。第二个变体更灵活,允许您应用各种过滤器。

于 2012-12-13T16:31:35.380 回答