gpt4 book ai didi

scala - 如何在 Sorm 中为一个有很多 child 的实体建模?

转载 作者:行者123 更新时间:2023-12-01 10:57:47 25 4
gpt4 key购买 nike

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

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

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

问题:我想知道:如何在 Sorm 中为 WorkspaceDocument 建模?这样我就可以在两者之间建立链接但不必加载工作区的所有文档?我想有一个 Repository这将使我能够访问工作区的文档,并支持分页。)

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

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

最佳答案

简单易行!您将它们定义为不相关:

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.* 中是这样),但由于能够在工作区上设置唯一约束,它应该在基于工作区的查询上表现更好。第二种变体更灵活,允许您应用各种过滤器。

关于scala - 如何在 Sorm 中为一个有很多 child 的实体建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13863337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com