2012-12-14 26 views
6

MongoDBを使用してコンテンツタグを実装したいと考えています。リレーショナルデータベースでは、のコンテンツ(例: "products")とタグテーブルの間に多対多の関係があるようにするのが最適な方法です。しかし、NoSQLデータベースの最良のアプローチは何ですか?MongoDBによるコンテンツタグ付け

「内容」文書のタグ配列内のすべてのタグをつけ、または文字列にタグへの参照を置く方が良いでしょうか?

+0

[Mongoで投稿タグを実装する方法は?](http://stackoverflow.com/questions/8455685/how-to-implement-post-tags-in-mongo) –

答えて

10

MongoDBでn:mリレーションシップを持つほとんどの場合、参照の代わりに埋め込みを使用する必要があります。だから私は、あなたがタグ名を持つ各製品の配列 "タグ"を持ってお勧めします。私は、あなたのシステムでは、単一の製品を見ているのが最も頻繁なユースケースになると考えています。このデザインでは、単一のデータベースクエリでタグ名のリストを持つ製品をユーザーに表示することができます。

製品にバインドしたくないタグに関する追加のメタデータ(タグの長いテキストなど)が必要な場合は、追加のタグコレクションを作成することができます。ここで、名前フィールド高速検索と重複の回避のためのユニークなインデックスを取得します。ユーザーがタグ名をクリックするか、またはタグ名の上を移動すると、追加のクエリを使用してタグの詳細を取得できます。

このデザインで問題になるのは、タグを削除したり名前を変更したりする場合です。タグを含むすべての製品を編集する必要があります。しかし、MongoDBはSQLデータベースのようにCASCADE ON DELETEを使用して外部キーを認識しないため、相互に参照しているドキュメントがある場合には常にこの問題が発生します。

名前の代わりにオブジェクトIDを製品のタグ配列に格納することで、タグの名前を変更することを容易にすることができます。しかしIDには、ユーザーにとって役に立たないという欠点があります。商品ページを表示するには、タグの名前を取得する必要があります。これは、追加のデータベースクエリを必要とするタグコレクションからすべてのものを要求する必要があることを意味します。

+1

私はそれがだとは思わない埋め込みとリンクをアドバイスするときに「ほとんどの場合」と言ってもいいでしょう。実際にはユースケースに依存しますが、タグの場合は埋め込みが正しいことがわかりますが、他のn:mの関係では埋め込みがひどく間違っている可能性があります。 –

+0

@AsyaKamskyあなたがお勧めするものは?この場合は – mayankcpdixit

+2

ですが、私は埋め込みをお勧めします。私は、「ほとんどの場合」に埋め込むのが正しいだろうという提案に反対しています。 –

関連する問題