这是一个非常标准的问题,但我不确定Scala中的标准答案是什么,特别是Scala / Scala.js系统。
考虑到您有一个由以下内容组成的域:
ContractorAgentAgencyInvoice与这些关系:
Contractor -[has_agent]-> AgentAgent -[has_agency]-> AgencyAgency -[has_Inoivce]-> Invoice域存储在SQL数据库中,并使用Slick将其读入服务器端的Scala案例类中。Case类对应于数据库表中的行,外键用于创建更复杂(嵌套)的案例类。例如,Contractor的case类
case class Contractor(
id: Int,
name: String,
agent: Agent
)和一个Agent
case class Agent(
id: Int,
name: String,
agency: Agency
)服务器将case类序列化为JSON,以便交付给客户端。
当反序列化回客户机上的case类时(感谢scala),每个获取的数据集都形成自己的孤立对象图。如果获取两个Contractor,并且它们都具有相同的Agent,则它们将包含链其余部分的重复集,直到Agency为止。如果在客户端上更改了一个对象图中的信息,或者稍后再通过获取更新,那么数据不同步的风险就很大。
事实上,服务器上也可以出现两个副本,因为每次从数据库读取给定行时都会创建一个副本。但在服务器上,它们的寿命很短。
从概念上来说,在客户端上构建一些集合并确保每个对象只有一个副本在概念上并不困难,但这是一个工作,而且是一个普遍的问题。
是否有标准框架可供使用?也许是一个缓存框架?最适合使用Scala.js的Scala (使用灵活的播放和MySQL)?
发布于 2016-04-26 20:32:30
首先,在JSON中没有嵌套对象。我将通过为每个不同的实体建立一个唯一的ID来建模关系。您可能已经拥有了这个,作为支持联接的外键。
示例类:
case class Contractor(
id: ContractorId, //Prefer typed Ids (wrapped values) instead of primitives.
name: String
agent: AgentId
)然后,您可以在客户机上使用类似于二极管的东西,可能对相关实体使用ReftTo。
https://stackoverflow.com/questions/36852229
复制相似问题