7

この質問は必ずしも Couchbase 2.0 開発プレビュー固有のものではありませんが、新しい Couchbase 製品を調査する際に役立つと思います。

データモデリングに関するアドバイスを探しています。リアルタイム分析に使用できる可能性があるため、Couchbase を調査しています。

ただし、実世界のデータをモデル化する最善の方法に関するドキュメントは見つかりません。

シナリオを提案します。コミュニティが私を助けたり、これをモデル化する方法についていくつかのアイデアを議論したりできる場合、それは非常に役立ちますか?

これは私たちの製品を代表するものではなく、私たちに代わってモデリングを解決するよう人々に求めているわけではないことに注意してください。

顧客が特定の日時に製品を購入し、製品には ID、名前、説明、価格などの情報があり、購入が日付に行われると仮定します。

最初の要件は、2 つの日付間のすべての購入をカウントできることです。1 日で 100,000 を超える購入があるかもしれません - これはかなり大きなビジネスです ;)

構文のいずれかが正しくない場合はお知らせください。すべてのアドバイス/ヘルプを歓迎します。

データを次のようにモデル化した場合 (完全に間違っている可能性があります):

商品と一緒に購入

{
    "_id" : "purchase_1",
    "_rev" : "1-1212afdd126126128ae",
    "products" :  [
        "prod_1" : {
            "name" : "Milk",
            "desc" : "Semi-skimmed 1ltr",
            "price" : "0.89"
        },
        "prod_7568" : {
            "name" : "Crisps", 
            "desc" : "Salt and Vinegar",
            "price: "0.85"
        }
    ]
    "date" : "2012-01-14 14:24:33"
}

{
    "_id" : "purchase_2",
    "_rev" : "1-1212afdd126126128ae",
    "products" :  [
        "prod_89001" : {
            "name" : "Bread", 
            "desc" : "White thick sliced",
            "price: "1.20"
        }
    ]
    "date" : "2012-01-14 15:35:59"
}

このドキュメント レイアウトでは、各購入を確認でき、その購入に含まれていた製品を確認できますが、2 つの日付間のすべての購入をカウントするにはどうすればよいでしょうか? また、2 つの日付間のすべての購入のログを日付の降順で表示するにはどうすればよいでしょうか?

これはCouchbaseが適しているものですか?

2 つの日付の間に何十万もの購入があるかもしれませんが、顧客はレポートを待ちたがりません….誰もが経験していると思います ;)

incr 関数を使用するのが最善でしょうか? その場合、どのようにデータをモデル化しますか?

これを読んでくれた人に感謝します。可能であれば、現実世界のモデリングの問題の例をさらに詳しく説明したいと思います。

ジェームズ

4

1 に答える 1

6

最も単純なケースでは、日付フィールドをキーとして使用してビューを作成する Map 関数を作成できます。

したがって、ドキュメントのデザインを少し変更すると、次のようになります。

{
   "_id": "purchase_1",
   "_rev": "2-c09e24efaffd446c6ee8ed6a6e2b4a22",
   "products": [
       {
           "id": "prod_3",
           "name": "Bread",
           "desc": "Whole wheat high fiber",
           "price": 2.99
       }
   ],
   "date": "2012-01-15 12:34:56"
}

{
   "_id": "purchase_2",
   "_rev": "2-3a7f4e4e5907d2163d6684f97c45a715",
   "products": [
       {
           "id": "prod_1",
           "name": "Milk",
           "desc": "Semi-skimmed 1ltr",
           "price": 0.89
       },
       {
           "id": "prod_7568",
           "name": "Crisps",
           "desc": "Salt and Vinegar",
           "price": 0.85
       }
   ],
   "date": "2012-01-14 14:24:33"
}

マップ関数は次のようになります。

function(doc) {
  for (var product in doc.products) {
    emit(doc.date, doc.products[product].price);
  }  
}

必要に応じて、日付ごとに購入を合計する reduce 関数を追加できます。

function(keys, values) {
    return sum(values);
}

次に、startkey パラメーターと endkey パラメーターを使用してビューを照会できます。

http://localhost:5984/couchbase/_design/Products/_view/total_price_by_date?startkey="2012-01-01"&endkey="2012-01-31"&group=true

ビューのクエリからの出力は次のようになります。

{"rows":[
{"key":"2012-01-14 14:24:33","value":4.94},
{"key":"2012-01-15 12:34:56","value":2.99}
]}

または、グループ パラメータを削除して、日付範囲全体の合計を取得します。

{"rows":[
{"key":null,"value":7.930000000000001}
]}

それが役立つことを願っています。

-- ジョン

于 2012-01-17T18:37:14.153 に答える