Le système de réservation de cours est-il adapté aux scénarios mongodb ?
巴扎黑
巴扎黑 2017-05-02 09:25:40
0
1
731

Il existe un projet pour la réservation de cours par l'utilisateur. Étant donné que le backend a un nœud pour le faire, mongodb est un bon choix. Cependant, car le système de réservation de cours a une transaction d'informations de réservation de cours une fois que l'utilisateur a effectué avec succès une réservation ou annulé. la réservation. Opération, ma compréhension de mongo est qu'il ne convient pas à une utilisation dans des scénarios de transaction. Je ne connais pas grand-chose à la conception de bases de données. Je voudrais demander si mongodb est adapté à des projets tels que les réservations de cours ?

巴扎黑
巴扎黑

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