有一个用户课程预约的项目,因为后端有node来做,所以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 メソッドとの比較🎜」を参照してください。