2009-11-04 9 views
6

簡単な例を挙げておきます:あなたには注文とショッピングカートがあります。私がこれを維持することを構想する一つの方法は、注文書とカート書類を保存することです。 Orderドキュメントには、ショッピングカートと呼ばれるフィールドがあり、その値は関連するカートドキュメントのUUIDです。私がこれをやっていると想像できるもう一つの方法は、Cart全体の連想配列を含む "shopping-cart"フィールドを持つOrder文書を保存することです。つまり、Cartを独立した文書として明示的に保存するのではなく、カート文書をOrder文書に埋め込みます。CouchDBで外部キーを実装する慣習的な方法は何ですか?

カートが永続的であることを後で判断すると、戻ってきたユーザーは半完成のカートがセッション中に彼を待っているのを発見しますか?私は、両方の方法を組み合わせることができると思います。不完全な間にカートを分けておき、ファイナライズ/購入時にオーダー文書に埋め込みます。

どちらのメソッドも動作しますが、私はCouchDBが外部キー制約を持っていないか心配です。最初の方法ではカートの文書を削除して、破損したデータセットを残すことができます。

どの方法を使用するかはどのように決定しますか?これらのメソッドの1つはCouchDBにとってもっと慣れていますか?私が逃した方法はありますか?

私はCouchDBの新機能ですので、多かれ少なかれ標準化された構造を持つことには利点/欠点を見るのが難しいです。

答えて

4

一方、1対1ではない複雑なキーを使用すると、照合照合を使用して結合を行うことができます。

function(doc) { 
    if (doc.type == 'order') { 
    emit([doc.cartid, 1], doc); 
    } else if (doc.type == 'cart') { 
    emit([doc.id, 0], doc); 
    } 
} 

ドキュメントは、カートの後の注文と一緒にカートリッドによって照合されます。あなたのアプリケーションコードはこのストリームに簡単に加わることができ、startkeyとendkeyを使って特定のcartidで問い合わせることができます。

参照:照合規則については、View Collationを参照してください。

reduceを使用して一緒に結合することもできます。

ただ、これにマップ機能を変更します。これはcartid、の配列意志カートごとに単一の文書を返します

function(keys, values) { 
    var out = {cartid: null, orders: [], cart: null}; 
    for (idx in values) { 
    var doc = values[idx]; 
    out['cartid'] = doc.cartid; 
    if (doc.cart) { out['cart'] = doc.cart }; 
    for (idx2 in doc.orders) { 
     out.orders.push(doc.orders[idx2]); 
    } 
    } 
    return out; 
} 

を:

function(doc) { 
    if (doc.type == 'order') { 
    emit([doc.cartid, 1], {cartid: doc.cartid, orders: [doc]}); 
    } else if (doc.type == 'cart') { 
    emit([doc.id, 0], {cartid: doc.id, orders: [], cart: doc); 
    } 
} 

と、このように減らす機能を追加注文書およびカート書類を含む。

上記のコードにエラーがある場合は申し訳ありませんが、私はそれらを試してみるのに便利なcouchdbテストインスタンスを持っていません。あなたは一般的な考えを得るべきであり、CouchDB wikiには詳細があります。

0

注文とカートのオブジェクトが1対1の関係(それはどのように聞こえるか)がある場合、2番目のアプローチが最も理にかなっています。これにより、探しているデータの完全性が得られ、シンプルになります;

関連する問題