4648. Для нового функционала аналитики необходимо хранить иерархическую структуру отделов компании с неограниченным уровнем вложенности. Какая модель хранения будет наиболее эффективной для частых запросов «найти всех потомков отдела X»?
Anonymous Quiz
56%
Использовать рекурсивные запросы (CTE) с таблицей, где есть поля id и parent_id.
7%
Хранить полный путь в текстовом поле (например, 1.5.12.34).
20%
Создать отдельную таблицу связей для каждого уровня вложенности.
17%
Использовать документоориентированную NoSQL БД, отказавшись от иерархии.
👩🏫Объяснение:
Это классический и гибкий подход для работы с иерархиями в реляционных БД. Поле parent_id формирует связь, а рекурсивный запрос позволяет обходить дерево в глубину или ширину. Хранение пути (вариант 2) уязвимо к изменениям и сложно поддерживается. Создание таблиц под каждый уровень (3) не подходит для неограниченной вложенности. Выбор NoSQL (4) должен быть обоснован другими требованиями, а не только иерархией. CTE — стандартное и поддерживаемое решение.
4649. Вы анализируете требования к системе кэширования сессий пользователей. Данные: простые ключ-значение, время жизни — 15 минут, объем данных огромен, доступ должен быть мгновенным. Какую технологию предпочтете?
Anonymous Quiz
82%
Использовать специализированное in-memory хранилище, такое как Redis.
8%
Создать таблицу в основной реляционной PostgreSQL БД.
3%
Запись сессий в файлы на диске.
7%
Использовать докуменную БД MongoDB.
👩🏫Объяснение:
Ключевые слова здесь: «время жизни», «ключ-значение», «мгновенный доступ». Redis создан именно для таких сценариев: это резидентная (in-memory) БД, что обеспечивает микросекундную скорость отклика. Она имеет встроенные механизмы TTL (время жизни данных). Основная реляционная БД (2) будет излишне нагружена и медленна для этой задачи. Файлы (3) и MongoDB (4) не обеспечат требуемой скорости и удобства управления TTL.
4650. При проектировании БД для системы заказов вы столкнулись с требованием: «Стоимость заказа должна всегда равняться сумме стоимостей его позиций». Где должна быть реализована эта бизнес-логика?
Anonymous Quiz
19%
В отдельном микросервисе, который валидирует заказы.
11%
В логике фронтенда, перед отправкой данных.
9%
Только в коде backend-приложения.
61%
На уровне БД, с помощью триггера, который пересчитывает и обновляет итог.
👩🏫Объяснение:
Это требование относится к целостности данных (consistency). Если логика находится только в backend-коде (2), то прямой доступ к БД в обход приложения (например, для исправлений) нарушит это правило. Триггер гарантирует, что правило выполняется всегда, при любом изменении данных. Это самый надежный уровень защиты бизнес-инварианта. Хотя дублирование проверок в коде приложения — это good practice, основная гарантия должна быть со стороны хранилища данных.
4651. Для хранения и сложного поиска по полуструктурированным логам действий пользователей (JSON с разными наборами полей) лучше всего подходит:
Anonymous Quiz
14%
Реляционная БД с заранее определенными колонками.
74%
Документоориентированная NoSQL БД, такая как MongoDB или Elasticsearch.
7%
Классическая SQL БД с хранением JSON в текстовом поле.
5%
Графовая база данных.
👩🏫Объяснение:
Полуструктурированные данные с меняющейся схемой — их родная стихия. Такие БД позволяют хранить каждый документ (лог) с его уникальным набором полей и эффективно индексировать и искать по вложенным атрибутам. Elasticsearch дополнительно дает мощные полнотекстовые и аналитические возможности. Реляционная БД (1) будет требовать сложных миграций при изменении структуры логов, а хранение JSON в текстовом поле (3) резко снизит возможности поиска. Графовая БД (4) предназначена для других задач.
4652. При частых операциях JOIN между очень большими таблицами Orders и Customers производительность падает. Какая оптимизация будет наиболее эффективной?
Anonymous Quiz
0%
Увеличить объем оперативной памяти на сервере БД.
8%
Отказаться от использования JOIN и делать два последовательных запроса.
51%
Денормализовать данные: добавить часто запрашиваемые поля из Customers прямо в таблицу Orders.
41%
Создать материализованное представление (Materialized View) с уже объединенными данными.
👩🏫Объяснение:
Денормализация — это сознательное нарушение нормальных форм для увеличения скорости чтения, путем исключения дорогостоящего JOIN. Материализованное представление — это «снимок» результата JOIN, который периодически обновляется. Это классический trade-off между скоростью чтения и актуальностью данных. Увеличение памяти может помочь, но не решит проблему кардинально. Два последовательных запроса (3) часто работают еще медленнее.
4653. Вы аналитик в стартапе по доставке еды. При проектировании БД для сущности «Заказ» выяснилось, что один заказ может содержать несколько блюд, а одно блюдо может фигурировать в разных заказах. Как правильно смоделировать эту связь?
Anonymous Quiz
1%
Добавить в таблицу Order повторяющиеся столбцы Dish_1, Dish_2 и т.д.
14%
В таблицу Order добавить столбец Dish_ID, который будет ссылаться на блюдо.
74%
Создать две таблицы: Order и Dish, и связующую таблицу Order_Dish с order_id и dish_id.
10%
Хранить список ID блюд в виде JSON-массива в одном столбце dishes таблицы Order.
❤1
👩🏫Объяснение:
Это классический пример связи «многие ко многим» (many-to-many). Один заказ содержит много блюд, одно блюдо входит в многие заказы. Корректная и нормализованная модель в реляционной БД — создание связующей (junction) таблицы. Вариант A нарушает 1НФ (повторяющиеся группы), B — подразумевает связь «один ко многим» (одно блюдо в заказе), а D (хранение массива) хоть и используется в NoSQL, в реляционной БД усложнит агрегацию, отчетность и целостность данных на уровне СУБД.
4654. В системе электронных билетов пользователи жалуются на медленную загрузку «Истории заказов». Страница формируется запросом с JOIN 4-х таблиц и сортировкой по дате. Индексы расставлены на первичные ключи. Что, скорее всего, ускорит выборку данных?
Anonymous Quiz
38%
Добавить составной индекс на поля, используемые в условиях WHERE и ORDER BY.
5%
Увеличить размер оперативной памяти на сервере БД.
52%
Денормализовать данные, создав таблицу User_Order_History, которая обновляется триггерами.
6%
Разделить (shard) базу данных по первым буквам email пользователей.
👩🏫Объяснение:
Частая причина медленных запросов — отсутствие правильных индексов под конкретную нагрузку. Индексы на PK ускоряют поиск по ID, но не по условиям WHERE или сортировке. Составной индекс, покрывающий фильтрацию и сортировку, кардинально ускорит запрос. Варианты B, C, D — это более тяжелые архитектурные изменения, которые уместны, если оптимизация индексов и запросов уже не помогает. Начинать всегда нужно с анализа плана запроса (EXPLAIN) и индексов.
Частая причина медленных запросов — отсутствие правильных индексов под конкретную нагрузку. Индексы на PK ускоряют поиск по ID, но не по условиям WHERE или сортировке. Составной индекс, покрывающий фильтрацию и сортировку, кардинально ускорит запрос. Варианты B, C, D — это более тяжелые архитектурные изменения, которые уместны, если оптимизация индексов и запросов уже не помогает. Начинать всегда нужно с анализа плана запроса (EXPLAIN) и индексов.