これはかなり標準的な問題ですが、Scala、特にScala/Scala.jsシステムの標準的な答えは何か分かりません。関係でクライアント/サーバーscala.js/scalaシステムのクライアント上にリレーショナル・オブジェクト・ツリーをキャッシュするためのフレームワーク・ソリューションですか?
Contractor
Agent
Agency
Invoice
:
は、ドメインは、から成る持っていることを考えると
Contractor -[has_agent]-> Agent
Agent -[has_agency]-> Agency
Agency -[has_Inoivce]-> Invoice
ドメインは、SQLデータベースに格納され、スリックを使用して、サーバー側のScalaのケースクラスに読み込まれます。ケース・クラスはデータベース表の行に対応し、外部キーはより複雑な(ネストされた)ケース・クラスの作成に使用されます。例えば。 Contractor
用ケースクラス:
case class Contractor(
id: Int,
name: String,
agent: Agent
)
とAgent
case class Agent(
id: Int,
name: String,
agency: Agency
)
サーバがクライアントに配信するためにJSONにケースクラスをシリアル化します。
(scala-jsのおかげで)クライアント上のケースクラスに逆シリアル化されたとき、フェッチされた各データセットはそれ自身の独立したオブジェクトグラフを形成します。 2つのContractor
がフェッチされ、両方が同じAgent
を持っていた場合、残りのチェーンの重複セットがAgency
まで含まれていました。 1つのオブジェクトグラフの情報がクライアント上で変更された場合、または後でフェッチすることによって更新された場合、データが同期していない大きなリスクがあります。
実際には、特定の行がデータベースから読み取られるたびにコピーが作成されるため、2つのコピーがサーバーにも表示されます。しかし、サーバー上では短命です。
クライアント上にいくつかのコレクションを構築し、各オブジェクトのコピーを1つしか作成しないことは概念的には難しくありませんが、それは一般的な問題です。
使用する標準的なフレームワークはありますか?おそらくキャッシングフレームワークですか? Scala.js(SlickとPlayとMySQL)でScalaに最適ですか?