2

現在のScalaのcouchdbドライバーについて私が持っている質問の1つは、それらが「部分的な」スキーマで動作するかどうかということです.私が何を意味するかを説明しようとします.私が見たライブラリはすべて、データベースを Scala オブジェクトに変換し、Scala オブジェクトを処理し、それを JSON に戻す. これは、アプリケーションがそのタイプのオブジェクトについてすべてを知っている場合、特にそれがそのデータベースと対話する唯一のソフトウェアである場合には問題ありません.ただし、JSON オブジェクトの一部しか認識しない小さなアプリケーションを作成したい場合はどうすればよいでしょうか。たとえば、次のように埋め込まれた 'mybook' コンポーネントだけに関心がある場合はどうでしょう。

{
  _id: "0ea56a7ec317138700743cdb740f555a",
  _rev: "2-3e15c3acfc3936abf10ea4f84a0aeced",
  type: "user",
  profiles: {
    mybook: {
      key: "AGW45HWH",
      secret: "g4juh43ui9hg929gk4"
    },
    .. 6 or 7 other profiles
  },
  .. lots of other stuff
}

JSON AST 全体を Scala オブジェクトに変換したくありません。一方、couchdb では、JSON ドキュメント全体を保存する必要があるため、これを何らかの方法で保存する必要があります。私は本当に何がこのようなものだと思います:

class MyBook {
  private val userJson: JObject = ... // full JSON retrieved from the database
  lazy val _id: String = ... // parsed from the JSON
  lazy val _rev: String = ... // parsed from the JSON
  lazy val key: String = ... // parsed from the JSON
  lazy val secret: String = ... // (ditto)
  def withSecret(secret: String): MyBook = ... // new object with altered userJson
  def save(db: CouchDB) = ... // save userJson back to couchdb
}

利点:

  • 必要なフィールドのみを抽出するための計算コストが低い
  • 「mybook」部分を除いて、データベースの進化と同期する必要はありません
  • 部分スキーマを使用した開発により適しています
  • データベース スキーマについていけなかった場合に不注意にフィールドを削除するなどの変更が少ないため、より安全です。

短所:

  • Scala のドメイン オブジェクトは、couch/JSON から完全に独立しているわけではありません
  • オブジェクトあたりのより多くのメモリ使用量

これは、現在の Scala ドライバーのいずれかで可能ですか? scouchdb または新しい Sohva ライブラリのいずれかでは、そうではないようです。

4

2 に答える 2

1

優れた JSON ライブラリと優れた HTTP クライアント ライブラリがあれば、スキーマレス CouchDB クライアント ライブラリの実装は非常に簡単です。

Java の例を次に示します: codetests

于 2012-11-03T18:15:46.927 に答える
0

私のcouchDBライブラリは、(デ)シリアル化にspray-jsonを使用しています。これは非常に柔軟で、ドキュメントの一部を無視して保存することができます。簡単な例を見てみましょう。

このようなドキュメントがあるとします

{
  dontcare: {
      ...
  },
  important: "foo"
}

次に、このドキュメントからの情報を保持するクラスを宣言し、変換方法を定義できます。

case class Dummy(js:JsValue)
case class PartialDoc(dontcare: Dummy, important: String)
implicit object DummyFormat extends JsonFormat[Dummy] {
  override def read(js:JsValue):Dummy = Dummy(js)
  override def write(d:Dummy):JsValue = d.js
}
implicit val productFormat = jsonFormat2(PartialDoc)

これは何も無視しdontcareますが、生の JSON AST として安全です。もちろん、この例は質問の例ほど複雑ではありませんが、問題を解決する方法を理解できるはずです。

于 2012-12-20T13:06:18.150 に答える