MongoDB を使用してコンテンツのタグ付けを実装したいと考えています。リレーショナル データベースでは、コンテンツ(「製品」など) とタグテーブルの間に多対多の関係を持たせるのが最善の方法です。しかし、NoSQL データベースでの最善のアプローチは何ですか?
「コンテンツ」ドキュメントのタグ配列にすべてのタグを配置するか、タグへの参照を文字列に配置する方がよいでしょうか?
MongoDB を使用してコンテンツのタグ付けを実装したいと考えています。リレーショナル データベースでは、コンテンツ(「製品」など) とタグテーブルの間に多対多の関係を持たせるのが最善の方法です。しかし、NoSQL データベースでの最善のアプローチは何ですか?
「コンテンツ」ドキュメントのタグ配列にすべてのタグを配置するか、タグへの参照を文字列に配置する方がよいでしょうか?
MongoDB に an:m リレーションがあるほとんどの場合、参照ではなく埋め込みを使用する必要があります。そのため、各製品にタグ名の配列「タグ」を用意することをお勧めします。単一の製品を見ることが、システムで最も頻繁に使用されるケースになると思います。この設計により、単一のデータベース クエリでタグ名のリストを含む製品をユーザーに表示できます。
製品にバインドしたくないタグに関する追加のメタデータ (タグの長いテキストの説明など) が必要な場合は、名前フィールドが一意のインデックスを取得する追加のタグ コレクションを作成できます。迅速な検索と重複の回避のために。ユーザーがタグ名をクリックまたはホバーすると、追加のクエリを使用してタグの詳細を取得できます。
この設計で問題となるのは、タグを削除または名前変更する場合です。次に、タグを含むすべての製品を編集する必要があります。しかし、MongoDB は SQL データベースのように CASCADE ON DELETE で外部キーを認識しないため、相互に参照するドキュメントがある場合は常にこの問題が発生します。
製品のタグ配列に名前の代わりに objectID を格納すると、タグの名前変更が簡単になります。しかし、ID にはユーザーにとって役に立たないという欠点があります。商品ページを表示するには、タグの名前を取得する必要があります。つまり、タグ コレクションからすべてのタグをリクエストする必要があり、追加のデータベース クエリが必要になります。