Я создаю свое первое крупное приложение и придумал способ оптимизировать производительность запросов. Я не уверен, хотя, должен ли я пройти через это.
Вот описание моего подхода.
Каждый раз, когда создается учетная запись пользователя, этому пользователю присваивается случайное число от 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 в конечном итоге повлияет на производительность.
Должен ли я продолжать этот подход, или нет? Каковы последствия производительности?