ユーザーのコース予約を行うためのノードがバックエンドにあるため、mongodb が適しています。ただし、コース予約システムはユーザーが予約に成功した後、またはキャンセルした後にコース予約情報のトランザクションを行うため、mongodb が適しています。 mongo はトランザクション シナリオでの使用には適していないと理解していますが、mongodb はコース予約などのプロジェクトに適しているかどうかを聞きたいです。
给我你的怀抱2017-05-02 09:27:40
MongoDB は 強力なトランザクション のシナリオには適していませんが、多くのシナリオでは実際に強力なトランザクションを必要としないことが多く、結果整合性 で置き換えることができます。多くの強力なトランザクションは、データ モデル設定手法を通じて MongoDB ドキュメントのアトミック性に変換して、強力なトランザクションを回避することもできます。回避できるかどうかを判断できるように、どのような状況について話しているのかをより明確に説明する必要があります。
私が理解しているコース予約シナリオとしては、MongoDBを必要とする強いシナリオではありませんが、RDBMSを必要とするシナリオでもありません。したがって、MongoDB が使用に適しているかどうかを判断するには、具体的な状況を詳細に分析することをお勧めします。
=== 2017.4.9 更新 ===
コメントの更新内容を踏まえ、以下の追加説明を行います:
人数制限の要件は、MongoDB のドキュメントアトミック性を利用して解決できます。登録シナリオを理解している限りでは、誰がどのコースに申し込んだのか、合計何人が申し込んだのかを記録し、登録上限を超えないように管理しているだけです。次に、コースのデータ構造は次のように設計できます:
このコースは、誰かがサインアップすると更新できます:
リーリーつまり、このコースをコースIDで検索すると、申込者数が指定人数に満たない場合は新規申込者が追加され、それ以外の場合は変更されません。では、登録が成功したかどうかはどのように判断すればよいのでしょうか? findAndModify
は、デフォルトで変更前のドキュメントを返します (変更後のドキュメントを返すこともできます)。それで:findAndModify
默认会返回修改之前的文档(也可以返回修改之后的文档)。所以:
{
_id: ObjectId("58e9f6cd58d2c10959c8619a"),
title: "MongoDB入门教程",
intro: "演示用",
createdAt: ISODate("2017-04-09T17:00:00Z"),
createdBy: {
userId: 12345,
name: "MongoDB中文社区"
// 其他必要的信息
},
allowedAttendeeQty: 50, // 允许参与的人数
reservations: {
qty: 0, // 已预订人数
attendees: [123, 456, 789] // 参与人员ID
}
}
关于findAndModify
的用法请参考db.collection.findAndModify()。MongoDB中对一个文档的修改具备原子性,所以不难发现update
也可以很好地完成上述任务。关于update
和findAndUpdate
リーリー
findAndModify
の使用方法については、db.collection.findAndModify() を参照してください。 MongoDB 内のドキュメントへの変更はアトミックであるため、update
でも上記のタスクを適切に完了できることを見つけるのは難しくありません。 update
と findAndUpdate
の比較については、「update メソッドとの比較🎜」を参照してください。