3

ワークスペースにはゼロ、1 つ、または複数のドキュメントを含めることができるという考えで、エンティティがありWorkspaceます。Documentこれをモデル化するための私の最初のアプローチは次のとおりです。

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

私のワークスペースには多くのドキュメントが含まれている可能性があるため、これはうまくスケーリングしません。幸いなことに、私のビジネス要件により、ワークスペースとドキュメントを別々に扱うことができます (ワークスペースがある場合、そこに含まれるすべてのドキュメントを考慮する必要がある理由や不変条件がないという意味で)。

質問:私は疑問に思っています: どうすればSormWorkspaceで と をモデル化Documentして、2 つの間にリンクを作成できますが、ワークスペースのすべてのドキュメントをロードする必要はありませんか? ページネーションをサポートして、ワークスペースのドキュメントにアクセスできるリポジトリがあると思います。)

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 ( ... )

次に、それらをリンクする方法を選択します。2つ見えます。

バリアント#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。*では)、ワークスペースに一意の制約を設定できるため、ワークスペースベースのクエリでのパフォーマンスが向上するはずです。2番目のバリアントはより柔軟性があり、あらゆる種類のフィルターを適用できます。

于 2012-12-13T16:31:35.380 に答える