2016-04-25 4 views
0

Это довольно стандартная проблема, но я не уверен, какой стандартный ответ находится в 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)?

ответ

2

Я бы начал с отсутствия вложенных объектов в JSON. Я бы моделировал отношения, имея уникальный идентификатор для каждого отдельного объекта. Вероятно, у вас уже есть это, в качестве внешнего ключа для поддержки соединений.

Пример случай класс:

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

Тогда вы могли бы использовать что-то вроде Diode на клиенте, может быть, с ReftTo для соответствующих структур.