2

名前と価格の商品があります。

ユーザーは、購入した製品についてログに記録します。

# option 1: embed logs
product = { id, name, price }
user = { id, 
         name,
         logs : [{ product_id_1, quantity, datetime, comment },
                 { product_id_2, quantity, datetime, comment },
                 ... ,
                 { product_id_n, quantity, datetime, comment }] 
}

私はこれが好き。しかし、製品 ID の長さが 12 バイトで、数量と日時が 32 ビット (4 バイト) の整数で、コメントが平均 100 バイトの場合、1 つのログのサイズは 12+4+4+100 = 120 バイトになります。ドキュメントの最大サイズは 4MB であるため、ユーザーあたりのログの最大量は 4MB/120 バイト = 33,333 です。ユーザーが 1 日あたり 10 回の購入を記録すると仮定すると、33,333/10 = 3,333 日 ~ 9 年で 4MB の制限に達します。まあ、おそらく 9 年は問題ありませんが、さらに多くのデータを保存する必要がある場合はどうでしょうか? ユーザーが 1 日あたり 100 回の購入を記録した場合はどうなりますか?

ここで他のオプションは何ですか?これを完全に正規化する必要がありますか?

# option 2: normalized
product = { id, name, price }
log = { id, user_id, product_id, quantity, datetime, comment }
user = { id, name }

うーん。リレーショナルに戻ります。

4

2 に答える 2

3

サイズが主な関心事である場合は、mongo DbRefを使用してオプション 2 に進むことができます。

     logs : [{ product_id_1, quantity, datetime, comment },
             { product_id_2, quantity, datetime, comment },
             ... ,
             { product_id_n, quantity, datetime, comment }] 

Dbrefを使用して、このログをユーザー内に埋め込みます。

       var log = {product_id: "xxx", quantity:"2", comment:"something"}
       db.logs.save(log)
       var user= { id:"xx" name : 'Joe', logs : [ new DBRef('logs ', log._id) ] }
       db.users.save(user)
于 2010-09-15T05:01:48.270 に答える
0

はい、オプション 2 が最善の策です。はい、リレーショナル モデルに戻っていますが、データはそのようにモデル化するのが最適です。オプション 2 に特定のマイナス面は見当たりません。それは、悪い設計プロセスではなく、そのようにする必要があるデータです。

于 2010-09-14T14:03:51.370 に答える