1

Ich erstelle meine erste große App und dachte mir eine Möglichkeit zur Optimierung der Abfrageleistung aus. Ich bin mir aber nicht sicher, ob ich damit durchkommen soll.Soll ich in einem Cookie gespeicherte Informationen für Indexzwecke verwenden?

Hier ist eine Beschreibung meines Ansatzes.

Jedes Mal, wenn ein Benutzerkonto erstellt wird, wird diesem Benutzer eine Zufallszahl zwischen 1 und 10 zugewiesen, die in seinem Benutzerdokument gespeichert wird. Die Nummer wird als Nummern-ID bezeichnet. Hier ist, wie das Benutzerschema aussehen wird:

let User = new Schema({ 

/// I left out all the other fields for clairty sake 
numberId: { 
      type: Number, 
      default: Math.floor(Math.random() * 11), 
      index: true 
    } 
} 

Jedes Mal, wenn ein Benutzer erstellt einen Blogpost und Post, deren Nummer-Id wird im Dokument dieser Blogpost und Post verwiesen. Dies ermöglicht eine schnellere Abfrage durch Indexieren der Nummern-ID des Benutzers. Hier ist, wie das Dokument von einem Blogpost wie in MongoD aussehen:

{ 
    "title": "my Blog Post", 
    "_id": "ObjectId("594824b2828d7b15ecd7b6a5")", 
    /// Here is the numberId of the user who posted the blogpost, it is added 
    /// to the document of the blogpost when it is created. 
    "postersNumberId": 2 
    /// the Id of the user who posted the blogpost 
    "postersId": "59481f901f0c7d249cf6b050" 
} 

Lassen Sie uns sagen, dass ich alle Blogeinträge von einem bestimmten Benutzer gemacht erhalten möchten. Ich kann meine Abfrage viel schneller optimieren, indem ich die Nummer-ID des betreffenden Benutzers als Index benutze, da ihre Nummer-ID in allen Blogposts und Kommentar-Posts referenziert wird.

BlogPost.find({postersId: user_id, postersNumberId: user.numberId}); 

Es scheint, wie dieser Ansatz gewährleistet, dass ich speichere die Benutzer-Nummer-ID in req.user, um es leicht verfügbar zu sein, wenn ich es brauche Anfragen zu optimieren. Das heißt also, würde ich die Benutzer Daten in einem Cookie über Pass speichern müssen:

passport.serializeUser(function(user, done){ 
    done(null, user._id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.findById(id, function (err, user){ 
     if (err || !user) return done(err, null); 
     done(null, user); 
    }); 
}); 

diesen Ansatz gegeben, kann ich nun alle Informationen in dem Cookie gespeichert verwenden, insbesondere die numberId, Abfragen zu optimieren, dass das Abrufen ein Benutzer Kommentare und Blogeinträge macht:

BlogPost.find({postersId: req.user_id, postersNumberId: req.user.numberId}); 

aber ich json-web-Token bin mit dem Benutzer anstatt Cookies zu authentifizieren. Daher muss ich einen Cookie verwenden, um die Nummern-ID für die Indizierung zu speichern, zusätzlich zur Verwendung von JWT für die Authentifizierung. Ich habe jedoch gehört, dass die Verwendung von Cookies für die Skalierbarkeit schlecht ist. Daher mache ich mir Sorgen, dass die Speicherung der Nummern-ID des Benutzers in req.user letztendlich die Leistung beeinträchtigt.

Sollte ich mit diesem Ansatz fortfahren, oder nicht? Was sind die Auswirkungen auf die Leistung?

Antwort

0

Zusätzlich JWT zur Authentifizierung ein payload, die verwendet werden können, zusätzliche Informationen in dem erzeugten Token selbst zu speichern:

var jwt = require('jsonwebtoken'); 

var token = jwt.sign({ 
    data: { 
     numberId: 7 
    } 
}, 'jwtSecret', { 
    expiresIn: '1h' 
}); 

zum Abruf:

jwt.verify(token, 'jwtSecret', function(err, decoded) { 
    if (err) { 
     console.log(err) 
    } else { 
     console.log(decoded); 
     //{ data: { numberId: 7 }, iat: 1498350787, exp: 1498354387 } 
    } 
}); 
Verwandte Themen