client/server scala.js/scala 系统中客户端缓存关系对象树的框架解决方案?

Framework solution for caching relational object tree on client in client/server scala.js/scala system?

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

鉴于您的域包含:

与关系:

域存储在 SQL 数据库中,并使用 Slick 在服务器端读入 Scala case classes。 Case classes 对应于数据库表中的行,外键用于创建更复杂(嵌套)的 case classes。例如。 Contractor 的案例 class:

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

和一个Agent

case class Agent(
    id:     Int,
    name:   String,
    agency: Agency
)

服务器将案例 classes 序列化为 JSON 以交付给客户端。

当在客户端反序列化回 case classes 时(多亏了 scala-js),每个获取的数据集都形成了自己的独立对象图。如果两个 Contractor 被获取并且它们都具有相同的 Agent,它们将包含链的其余部分的重复集,直到 Agency。如果一个对象图中的信息在客户端发生更改或通过稍后再次获取进行更新,则数据不同步的风险很大。

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

在客户端上构建一些集合并确保每个对象只有一个副本在概念上并不困难,但这是可行的,而且是一个普遍问题。

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

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

案例class:

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

然后您可以对相关实体使用 Diode on the client, maybe with a ReftTo 之类的东西。