课程预约系统适合mongodb的场景吗?
巴扎黑
巴扎黑 2017-05-02 09:25:40
0
1
724

有一个用户课程预约的项目,因为后端有node来做,所以mongodb是个很好的选择,可是因为课程预约系统存在 用户预约成功后,或取消预约后,会有课程预约信息的事务操作,我对mongo的了解是她不适合用在事务场景里,我对数据库的设计不是很了解,想请问课程预约这样的项目适合用mongodb吗?

巴扎黑
巴扎黑

répondre à tous(1)
给我你的怀抱

MongoDB n'est pas adapté aux scénarios de transaction forte, mais de nombreux scénarios ne nécessitent souvent pas de transactions fortes et peuvent être remplacés par une cohérence éventuelle. De nombreuses transactions fortes peuvent également être converties en atomicité de document MongoDB grâce à des techniques de définition de modèles de données pour éviter les transactions fortes. Vous devez décrire plus clairement de quel type de situation vous parlez afin de pouvoir juger si elle peut être évitée.
Pour le scénario de réservation de cours que je comprends, ce n'est pas un scénario fort qui nécessite MongoDB, mais ce n'est pas un scénario qui nécessite un SGBDR. Donc, pour savoir si MongoDB est adapté à l'utilisation, il est recommandé d'analyser la situation spécifique en détail.
=== Mis à jour le 2017.4.9 ===
Sur la base des mises à jour dans les commentaires, les explications supplémentaires suivantes sont apportées :
L'exigence de limiter le nombre de personnes peut être résolue en utilisant l'atomicité des documents de MongoDB . Pour autant que je comprends le scénario d'inscription, il ne s'agit rien d'autre que d'enregistrer qui s'est inscrit à quel cours, combien de personnes se sont inscrites au total et de contrôler pour ne pas dépasser la limite d'inscription. Ensuite, la structure des données du cours peut être conçue comme ceci :

{
    _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
    }
}

Ce cours peut être mis à jour lorsqu'une personne s'inscrit :

var result = db.class.findAndUpdate(
    query: {
        _id: ObjectId("58e9f6cd58d2c10959c8619a"), 
        qty: {$lte: 50}    // 保证已报名人数小于50时才报名
    },
    update: {
        $inc: {
            "reservations.qty": 1 // 报名人数+1
        },
        $push: {
            "reservations.attendees": 102  // 新报名人员ID
        }
    }
});

C'est-à-dire recherchez ce cours en fonction de l'identifiant du cours. Si le nombre de candidats est inférieur au nombre spécifié, de nouveaux candidats seront ajoutés, sinon aucune modification ne sera apportée. Alors comment juger si l’enregistrement est réussi ? findAndModifyPar défaut, le document avant modification sera restitué (le document après modification peut également être restitué). Alors :

if (result.reservations.qty < 50) {
    // 报名成功
} else {
    // 报名失败
}

Pour l'utilisation de findAndModify, veuillez vous référer à db.collection.findAndModify(). Les modifications apportées à un document dans MongoDB sont atomiques, il n'est donc pas difficile de constater que update peut également bien accomplir les tâches ci-dessus. Pour les comparaisons entre update et findAndUpdate, veuillez vous référer à : Compare avec la méthode de mise à jour

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal