次の「スキーマ/関係」設計を想定して、カスケード削除のような操作で削除を処理するための推奨される方法は何ですか?
リレーショナルスキーマ:
+ --------- + + -------- + |学生|-* -------- 1- [登録] -1 -------- *-|コース| + --------- + + -------- +
MongoDB:
+ --------- + + -------- + |学生|-* ---------------- *-|コース| + --------- + + -------- +
コースへの学生の登録というこの古典的な設計を考えると、MongoDBを使用する場合、学生にコースのコレクションがあり、その逆も同様です(関係/登録テーブルには何もありません)。しかし、関係の世界から来た場合、コースを削除するセマンティクスをどのように処理すればよいですか?つまり、コースを削除すると、すべての「登録」レコードも削除されます。つまり、各生徒のレコードのコレクションからコースを削除する必要があります。 2つのクエリを実行する必要があるようです。1つはコースを削除するためのもので、次に各学生のコレクションから削除するためです。追加のクエリなしでセマンティックのようにこの「カスケード削除」を実行する単一のクエリを持つ方法はありますか?データモデルを変更する必要がありますか?
注:他のすべての使用例では、上記のデータモデルは問題なく機能します。
=>
その生徒とそれに関連して削除されたコースの関連コレクションを削除するだけです。=>
コースの学生コレクションから削除するだけです=>
基本的に、対応する「テーブル」に追加するだけです。唯一注意が必要なのは、コースの削除を処理することです。私はリレーショナル背景から出てきて、これを理解することができないので、MongoDBでこのシナリオをどのように処理するべきですか?.
あなたがやっていることは、モンゴでそれを行うための最良かつ最も最適な方法です。私は同様の状況にあり、N:M設計パターンの可能な実装をすべて行った後、この同じソリューションにたどり着きました。
どうやら、これはmongodbのことではなく、NoSQLの概念の多くであり、変化の少ないデータ(コース)を個別に保持できます。また、コースの削除は頻繁に行われる操作ではないため、すべてのレコードを調べて削除することは十分に可能です。
一方、そのままにしておくこともできます。アプリケーションロジックでは、コースドキュメントにreference_idがまったくないStudentドキュメントのコースの値を無視してください。ただし、その場合、古い削除済みのCourse_idが再利用されないようにする必要があります。
または、コースドキュメントで削除されたフラグを使用して、アプリケーションロジックの他のすべてを処理します。
Mongoチームの推奨事項に基づいて回答します。私はリレーショナルデータベースからも来ましたが、最初は概念を理解するのにいくつかの問題がありました。 Mongoチームは、「アプリケーション駆動型」スキーマのアイデアを使用して設計することをお勧めします。そのため、最初にどのデータの断片が結合するかを理解する必要があります。 Mongoには、このようなトランザクションの概念はあり得ないことを覚えておいてください。たとえトランザクションを処理するドライバーを発明したとしても、独自のソリューションを実装する必要があります。つまり、常に同時に更新する必要がある2つのビジネスオブジェクトがあり、この操作の失敗を許容できない場合は、それらを1つのドキュメント(アトミック)に結合する必要があります。
あなたの場合、学生とコースの2つのドキュメントと、それらの間の関係(学生はNコースに登録します)があります。コースは常に変更する必要がないので、別のコレクションに保存できます。ただし、ポイントはそれらの間の関係です。この場合、学生と彼が登録したすべてのコースをアトミックに削除する必要があります。したがって、これに最適な解決策は、関係を学生に埋め込み、個別のコースコレクションを保持することです。生徒を削除すると、関係も同時に削除されます。
学生の息子:
{ _id: ObjectId('...'), name:"John", lastname:"Smith",
courses: [ 1, 100, 50, 67 ], ...
}
コースは、それらの間の別個のコレクションにすることができます。これがモンゴでそれを処理する方法です。アトミック操作は単一のドキュメントに埋め込む必要があります。コースはあまり変更されないコースのリストであると想定しました。コースが生徒によって設計された場合、ソリューションを少し変更することができます。