Вопрос проверяет понимание методов оптимизации передачи данных между клиентом и сервером для уменьшения нагрузки на БД и ускорения работы приложения.
Оптимизация взаимодействия между backend и frontend при работе с базой данных направлена на сокращение объема передаваемых данных, уменьшение количества запросов и ускорение обработки. Рассмотрим ключевые методы.
Вместо загрузки всех записей сразу используйте пагинацию с параметрами limit и offset или курсорную пагинацию. Проекция позволяет выбирать только необходимые поля, избегая передачи лишних данных.
// Пример пагинации на Express
app.get('/api/users', async (req, res) => {
const { page = 1, limit = 10 } = req.query;
const offset = (page - 1) * limit;
const users = await db.query('SELECT id, name, email FROM users LIMIT $1 OFFSET $2', [limit, offset]);
res.json(users);
});Кэширование на уровне сервера (например, Redis) или клиента (HTTP-кэширование) уменьшает количество обращений к БД. Для часто запрашиваемых данных можно установить TTL и обновлять кэш при изменениях.
// Пример кэширования с Redis
const cache = require('redis').createClient();
app.get('/api/posts', async (req, res) => {
const cached = await cache.get('posts');
if (cached) return res.json(JSON.parse(cached));
const posts = await db.query('SELECT * FROM posts');
await cache.set('posts', JSON.stringify(posts), 'EX', 60);
res.json(posts);
});Используйте GraphQL или кастомные эндпоинты, чтобы клиент мог запросить связанные данные за один запрос. Это снижает количество HTTP-запросов и нагрузку на БД.
// GraphQL схема
type Query {
user(id: ID!): User
}
type User {
id: ID
name: String
posts: [Post]
}Применение пагинации, проекции, кэширования и объединения запросов позволяет существенно снизить нагрузку на БД и ускорить взаимодействие между frontend и backend. Эти методы особенно полезны в высоконагруженных приложениях с большими объемами данных.