8

Rails は、移行の概念を使用して、ActiveRecord API を使用してモデルの変更を処理します。

CouchDB は JSON (ネストされたマップと配列) を使用してモデル オブジェクトを表します。

これまでの CouchDB の作業では、ドキュメントの構造がいつ変更されたかを認識したり (開発者として規律を課す以外に)、ドキュメントを古いモデルから新しいモデルに移行したりする良い方法が見つかりませんでした。

既存の機能はありますか、または CouchDB でモデルの変更を処理するためのベスト プラクティスはありますか?

4

3 に答える 3

9

RDBMSの洗脳解除の時間です。:)

couchdbのスキーマレス設計の最大のポイントの1つは、移行の必要性を防ぐことを直接目的としています。オブジェクトのJSON表現により、オブジェクトをダックタイピングするのが簡単になります。

たとえば、ブログタイプのWebアプリがあり、投稿や、人々がブログに保存している派手なものが何であれ、それがあるとします。投稿ドキュメントには、作成者、タイトル、作成者などのフィールドがあります。ここで、「投稿を公開するときに月がどのフェーズにあるかを追跡する必要があります...」と考えて、moon_phaseを次のように追加します。新しい投稿への属性。

完了したい場合は、戻って古い投稿にmoon_phaseを追加しますが、これは必ずしも必要ではありません。

ビューでは、属性としてmoon_phaseにアクセスできます。そして、それはnullになるか、例外などを引き起こします。(JSの専門家ではありません。nullが正しい答えだと思います)

物事は、それは本当に重要ではありません。何かを変えたいと思ったら、それを変えてください。あなたの意見がその変化を理解していることを確認してください。私の経験では、これは実際にはそれほど多くを必要としません。

また、本当にパラノイアの場合は、次のようにバージョン/タイプ属性を保存できます。

{
   _id: "foo-post",
   _rev: "23490AD",
   type: "post",
   typevers: 0,
   moon_phase: "full"
}

お役に立てば幸いです。

于 2008-09-26T18:19:22.380 に答える
3

ActiveCouchをチェックしてください。

CouchDB は意図的にスキーマレスであるため、ActiveRecord の移行から同等の CouchDB への概念の 1 対 1 のマッピングはありません。ただし、ActiveCouch には、CouchDB の「ビュー」の移行が含まれています。

于 2008-09-24T23:32:52.387 に答える
3

スキーマを持つことに興味があり、それでも CouchDB を使用したい場合は、「インピーダンスの不一致」が発生します。

それにもかかわらず、「移行」を行うことはそれほど難しいことではありません。schema_version各ドキュメントに要素を追加します。次に、「ドキュメント読み取り機能」に更新を含めます。このようなもの:

def read(doc_id):
    doc = db.get(doc_id)
    if doc.schema_version == 1:
        # version 1 had names broken down too much
        doc.name = "%s %s" % (doc.first, doc.last)
        del doc.first
        del doc.last
        doc.schema_version = 2
        db.put(doc)
    if doc.schema_version == 2: weight
        # version 2 used kg instead of g
        doc.weight_g = doc.weight_kg * 1000
        del doc.volume_kg
        doc.schema_version = 3
        db.put(doc)
    return doc

DB 全体を一度にアップグレードしたい場合はread(doc_id)、すべてのドキュメントを呼び出すだけです。

于 2009-01-04T11:07:07.973 に答える