2016-04-25 6 views
0

これはかなり標準的な問題ですが、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に最適ですか?

答えて

2

JSONにネストされたオブジェクトがないことから始めます。私は、それぞれの別個のエンティティに対して一意のIDを持つことによって関係をモデル化します。ジョインをサポートするための外部キーとして既にこれを持っているでしょう。

例ケースクラス:

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

その後、あなたは多分関連エンティティのReftToで、クライアント上でDiodeのようなものを使用することができます。

関連する問題