Это довольно стандартная проблема, но я не уверен, какой стандартный ответ находится в Scala, особенно в системе Scala/Scala.js.Рамочное решение для кэширования дерева реляционных объектов на клиенте в системе client/server scala.js/scala?
Учитывая, что у вас есть домен, состоящий из:
Contractor
Agent
Agency
Invoice
с соотношениями:
Contractor -[has_agent]-> Agent
Agent -[has_agency]-> Agency
Agency -[has_Inoivce]-> Invoice
домен хранится в базе данных SQL и читать в случае классов Scala на стороне сервера с помощью Slick. Классы классов соответствуют строкам в таблицах базы данных, а внешние ключи используются для создания более сложных (вложенных) классов случаев. Например. класс случай для Contractor
:
case class Contractor(
id: Int,
name: String,
agent: Agent
)
и Agent
case class Agent(
id: Int,
name: String,
agency: Agency
)
Сервер упорядочивает классы регистра в формате JSON для доставки клиенту.
При десериализации обратно в классы case на клиенте (благодаря scala-js) каждый набор данных формирует свой собственный изолированный граф объектов. Если были выбраны два Contractor
s, и оба они имели одинаковые Agent
, они содержали бы дублирующие наборы остальной части цепочки до Agency
. Если информация в одном объектном графе изменяется на клиенте или обновляется путем выборки позже, существует большая вероятность того, что данные не синхронизированы.
Фактически на сервере могут появляться две копии, поскольку копия создается каждый раз, когда данная строка считывается из базы данных. Но на сервере они недолговечны.
Было бы сложно создать некоторые коллекции на клиенте и гарантировать, что есть только одна копия каждого объекта, но это работа, и это общая проблема.
Существует ли стандартная структура для использования? Возможно, возможно кэширование? Лучше всего подходит для Scala с Scala.js (с Slick и Play и MySQL)?