Rumah > Soal Jawab > teks badan
有一个用户课程预约的项目,因为后端有node来做,所以mongodb是个很好的选择,可是因为课程预约系统存在 用户预约成功后,或取消预约后,会有课程预约信息的事务操作,我对mongo的了解是她不适合用在事务场景里,我对数据库的设计不是很了解,想请问课程预约这样的项目适合用mongodb吗?
给我你的怀抱2017-05-02 09:27:40
MongoDB tidak sesuai untuk urus niaga kukuh senario, tetapi banyak senario selalunya tidak memerlukan transaksi yang kukuh, dan boleh digantikan dengan konsistensi akhirnya. Banyak urus niaga yang kukuh juga boleh ditukar kepada keatomitian dokumen MongoDB melalui teknik penetapan model data untuk mengelakkan transaksi yang kukuh. Anda perlu menerangkan dengan lebih jelas jenis situasi yang anda bincangkan supaya anda boleh menilai sama ada ia boleh dielakkan.
Untuk senario tempahan kursus yang saya faham, ia bukanlah senario kuat yang memerlukan MongoDB, tetapi ia bukan senario yang memerlukan RDBMS. Jadi untuk mengatakan sama ada MongoDB sesuai untuk digunakan, adalah disyorkan untuk menganalisis situasi tertentu secara terperinci.
=== Dikemas kini pada 2017.4.9 ===
Berdasarkan kemas kini dalam ulasan, penjelasan tambahan berikut dibuat:
Keperluan untuk mengehadkan bilangan orang boleh diselesaikan menggunakan atomicity dokumen MongoDB . Setakat yang saya faham senario pendaftaran, ia tidak lebih daripada merekodkan siapa yang telah mendaftar kursus mana, jumlah orang yang telah mendaftar, dan mengawal untuk tidak melebihi had pendaftaran. Kemudian struktur data kursus boleh direka bentuk seperti ini:
{
_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
}
}
Kursus ini boleh dikemas kini apabila seseorang mendaftar:
var result = db.class.findAndUpdate(
query: {
_id: ObjectId("58e9f6cd58d2c10959c8619a"),
qty: {$lte: 50} // 保证已报名人数小于50时才报名
},
update: {
$inc: {
"reservations.qty": 1 // 报名人数+1
},
$push: {
"reservations.attendees": 102 // 新报名人员ID
}
}
});
Maksudnya, cari kursus ini mengikut ID kursus Jika bilangan pemohon kurang daripada nombor yang ditetapkan, pemohon baharu akan ditambah, jika tidak tiada perubahan akan dibuat. Jadi bagaimana untuk menilai sama ada pendaftaran berjaya? findAndModify
Secara lalai, dokumen sebelum pengubahsuaian akan dikembalikan (dokumen selepas pengubahsuaian juga boleh dikembalikan). Jadi:
if (result.reservations.qty < 50) {
// 报名成功
} else {
// 报名失败
}
Untuk penggunaan findAndModify
, sila rujuk db.collection.findAndModify(). Pengubahsuaian pada dokumen dalam MongoDB adalah atom, jadi tidak sukar untuk mencari bahawa update
juga boleh menyelesaikan tugasan di atas dengan baik. Untuk perbandingan antara update
dan findAndUpdate
, sila rujuk: Bandingkan dengan Kaedah kemas kini