現在の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 ライブラリのいずれかでは、そうではないようです。