在客户机/服务器scala.js/scala系统中在客户机上缓存关系对象树的框架解决方案?

在客户机/服务器scala.js/scala系统中在客户机上缓存关系对象树的框架解决方案?,scala,caching,playframework,slick,scala.js,Scala,Caching,Playframework,Slick,Scala.js,这是一个相当标准的问题,但我不确定Scala中的标准答案是什么,尤其是Scala/Scala.js系统 假设您拥有一个由以下内容组成的域: 承包商 Agent 代理机构 发票 在关系方面: Contractor-[has\u agent]->agent Agent-[has\u agency]->agency agent-[has\u Inoivce]->发票 域存储在SQL数据库中,并使用Slick读取到服务器端的Scala case类中。案例类对应于数据库表中的行,外键用于创建更复杂

这是一个相当标准的问题,但我不确定Scala中的标准答案是什么,尤其是Scala/Scala.js系统

假设您拥有一个由以下内容组成的域:

  • 承包商
  • Agent
  • 代理机构
  • 发票
在关系方面:

  • Contractor-[has\u agent]->agent
  • Agent-[has\u agency]->agency
  • agent-[has\u Inoivce]->发票
域存储在SQL数据库中,并使用Slick读取到服务器端的Scala case类中。案例类对应于数据库表中的行,外键用于创建更复杂(嵌套)的案例类。例如,
承包商的案例类别:

case class Contractor(
    id:    Int,
    name:  String,
    agent: Agent
)
代理

case class Agent(
    id:     Int,
    name:   String,
    agency: Agency
)
服务器将案例类序列化为JSON以交付给客户端

当反序列化回客户机上的case类时(多亏了scala js),每个获取的数据集形成自己的独立对象图。如果提取了两个
承包商
,并且他们都有相同的
代理
,那么他们将包含链中剩余部分的重复集,直到
代理
。如果一个对象图中的信息在客户端上发生更改,或者通过稍后再次获取而更新,则存在数据不同步的巨大风险

事实上,服务器上也会出现两个副本,因为每次从数据库中读取给定行时都会创建一个副本。但在服务器上,它们是短暂的

从概念上讲,在客户机上构建一些集合并确保每个对象只有一个副本并不困难,但这是一个工作,也是一个普遍的问题


是否有一个标准框架可供使用?也许是缓存框架?最适合使用Scala.js的Scala(使用Slick and Play和MySQL)?

我会从JSON中没有嵌套对象开始。我将通过为每个不同的实体提供唯一的ID来建立关系模型。您可能已经有了它,作为支持联接的外键

示例案例类:

case class Contractor(
  id:    ContractorId, //Prefer typed Ids (wrapped values) instead of primitives.
  name:  String
  agent: AgentId
)

然后您可以在客户机上使用类似于的东西,可能对相关实体使用一个。我将通过为每个不同的实体提供唯一的ID来建立关系模型。您可能已经有了它,作为支持联接的外键

示例案例类:

case class Contractor(
  id:    ContractorId, //Prefer typed Ids (wrapped values) instead of primitives.
  name:  String
  agent: AgentId
)
然后你可以在客户机上使用类似的东西,也许可以在相关实体上使用