Должен ли я использовать информацию, хранящуюся в файле cookie, для индексации?

Я создаю свое первое крупное приложение и придумал способ оптимизировать производительность запросов. Я не уверен, хотя, должен ли я пройти через это.

Вот описание моего подхода.

Каждый раз, когда создается учетная запись пользователя, этому пользователю присваивается случайное число от 1 до 10, которое сохраняется в его пользовательском документе. Число называется номером-идентификатором. Вот как будет выглядеть схема пользователя:

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

Каждый раз, когда пользователь создает сообщение в блоге и сообщение, его номер-идентификатор упоминается внутри документа этого сообщения в блоге и сообщения. Это сделано для того, чтобы сделать запросы намного быстрее за счет индексации идентификатора номера пользователя. Вот как документ сообщения в блоге будет выглядеть в MongoD:

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

Допустим, я хочу получить все сообщения в блогах, сделанные определенным пользователем. Я могу оптимизировать свой запрос намного быстрее, используя номер-идентификатор рассматриваемого пользователя в качестве индекса, учитывая, что его номер-идентификатор упоминается во всех сообщениях в блогах и комментариях, которые они делают.

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

Похоже, что этот подход гарантирует, что я сохраняю идентификатор пользователя в req.user, чтобы он был легко доступен, когда мне это нужно для оптимизации запросов. Это означает, что мне придется хранить данные пользователей в файле cookie через паспорт:

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);
    });
});

При таком подходе я мог теперь использовать всю информацию, хранящуюся в файле cookie, в частности, числовой идентификатор, для оптимизации запросов, которые извлекают комментарии и сообщения в блогах, которые делает пользователь:

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

Однако я использую json-web-токены для аутентификации пользователя, а не файлы cookie. Поэтому мне придется использовать файл cookie для хранения идентификатора номера в целях индексации в дополнение к использованию JWT для аутентификации. Однако я слышал, что файлы cookie плохо влияют на масштабируемость, поэтому я обеспокоен тем, что сохранение идентификатора номера пользователя в req.user в конечном итоге повлияет на производительность.

Должен ли я продолжать этот подход, или нет? Каковы последствия производительности?


person MountainSlayer    schedule 24.06.2017    source источник


Ответы (1)


В дополнение к аутентификации JWT имеет payload, который можно использовать для хранения дополнительной информации в сгенерированном сам токен:

var jwt = require('jsonwebtoken');

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

Для поиска:

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