32

次の「スキーマ/関係」設計を想定すると、カスケード削除のような操作で削除を処理するための推奨される方法は何ですか?

リレーショナル スキーマ:

  +--------+ +--------+
  | | 学生 |-*--------1-[在籍]-1--------*-| コース |
  +--------+ +--------+

モンゴDB:

  +--------+ +--------+
  | | 学生 |-*----------------*-| コース |
  +--------+ +--------+

学生をコースに登録するというこの古典的な設計を考えると、MongoDB を使用する場合、学生にコースのコレクションを持ち、その逆は適切なデータ モデルのようです (関係/登録テーブルには何もありません)。しかし、リレーショナルの世界から来て、コースを削除するセマンティクスをどのように処理すればよいでしょうか? つまり、コースが削除されると、すべての「登録」レコードも削除される必要があります。つまり、各学生レコードのコレクションからコースを削除する必要があります。2 つのクエリを起動する必要があるようです。1 つはコースを削除するためのもので、次に各学生のコレクションから削除するためのものです。追加のクエリなしでセマンティックのようにこの「カスケード削除」を実行する単一のクエリを持つ方法はありますか? データモデルを変更する必要がありますか?

注: 他のすべてのユース ケースでは、上記のデータ モデルは問題なく機能します。

  • 学生=>を削除すると、その学生とそれに関連するコースのコレクションが削除されます。
  • コースを削除したい学生=>は、コースの学生コレクションからコースを削除するだけです
  • 学生/コース=>の追加は、本質的に対応する「テーブル」に追加するだけです。

唯一のトリッキーなことは、コースの削除を処理することです。私はリレーショナルのバックグラウンドを持っており、これを理解することができないため、MongoDB でこのシナリオをどのように処理すればよいでしょうか。

4

2 に答える 2

5

Mongo チームの推奨事項に基づいて回答します。私もリレーショナル データベースから来ましたが、最初は概念を理解するのにいくつか問題がありました。Mongo チームは、「アプリケーション駆動型」スキーマのアイデアを使用して設計することを推奨しています。そのため、最初にどのデータが一緒になるかを把握する必要があります。たとえトランザクションを処理するドライバーを発明したとしても、Mongo にはそのようなトランザクションの概念はありません。これには独自のソリューションを実装する必要があります。つまり、常に同時に更新する必要がある 2 つのビジネス オブジェクトがあり、この操作の失敗を許容できない場合、それらを 1 つのドキュメント (アトミック) に結合する必要があります。

あなたの場合、Student と Courses という 2 つのドキュメントと、それらの間の関係があります (学生は N コースに登録します)。コースは常に変更する必要はないので、別のコレクションに保存できると思います。しかし、ポイントはそれらの間の関係です。この場合、学生と彼が登録したすべてのコースをアトミックに削除する必要があります。したがって、これに最適な解決策は、関係を学生に埋め込み、別の Course コレクションを保持することです。学生を削除すると、関係も同時に削除されます。

学生 Json:

{ _id: ObjectId('...'), name:"John", lastname:"Smith", 
courses: [ 1, 100, 50, 67 ], ...
}

コースは、コース間の個別のコレクションにすることができます。これが Mongo での処理方法です。アトミック操作は、1 つのドキュメントに埋め込む必要があります。Courses はあまり変更されないコースのリストであると想定しました。学生によって設計されている場合は、ソリューションを少し変更できます。

于 2013-12-04T13:20:44.867 に答える