Моделирование данных и хранение
Знание моделирования данных для аналитика — уровни моделей, реляционные и NoSQL базы, ключи и ограничения, индексы, нормализация, транзакции, ACID и аномалии изоляции.
14 вопросов
JuniorТеорияОчень частоЧто такое реляционная БД, что такое первичный и внешний ключ?
Что такое реляционная БД, что такое первичный и внешний ключ?
Реляционная база хранит данные как таблицы из столбцов и строк с предопределёнными связями. Первичный ключ — минимальный уникальный атрибут, идентифицирующий строку; внешний ключ ссылается на первичный ключ другой таблицы, обеспечивая ссылочную целостность.
Типичные ошибки
- ✗Допускать повтор первичного ключа по строкам
- ✗Путать внешний ключ с первичным или резервной копией
- ✗Забывать, что внешние ключи обеспечивают ссылочную целостность
Уточняющие вопросы
- →Что такое составной первичный ключ?
- →Зачем нужна ссылочная целостность?
MiddleТеорияОчень частоЧто такое ACID и что гарантирует каждое свойство?
Что такое ACID и что гарантирует каждое свойство?
ACID — четыре гарантии транзакции: атомарность применяет все операторы или ни одного, консистентность переводит базу между валидными состояниями, изолированность не даёт транзакциям мешать, долговечность сохраняет зафиксированные изменения после сбоя.
Типичные ошибки
- ✗Приписывать свойство не тому (например, долговечность вместо атомарности)
- ✗Путать консистентность с изолированностью
- ✗Считать ACID функциями производительности, а не гарантиями
Уточняющие вопросы
- →Какое свойство нарушается при «грязном чтении»?
- →Как изолированность связана с уровнями изоляции?
MiddleТеорияОчень частоЧем SQL (реляционные) БД отличаются от NoSQL и когда выбирать каждую?
Чем SQL (реляционные) БД отличаются от NoSQL и когда выбирать каждую?
SQL-базы используют фиксированную схему и стандартный язык запросов, давая строгую консистентность и богатые соединения. NoSQL использует гибкие модели для неструктурированных данных и масштабируется горизонтально. SQL — для связей и транзакций, NoSQL — для масштаба.
Типичные ошибки
- ✗Менять местами, у какой модели фиксированная, а у какой динамическая схема
- ✗Утверждать, что NoSQL строго лучше для транзакций и соединений
- ✗Выбирать модель без учёта объёма данных или паттерна доступа
Уточняющие вопросы
- →Какой тип NoSQL подойдёт для кэша?
- →Почему соединения сложнее в NoSQL?
JuniorТеорияЧастоЧто такое индекс в БД и зачем он нужен?
Что такое индекс в БД и зачем он нужен?
Индекс — объект базы данных, ускоряющий поиск за счёт упорядоченной структуры по одному или нескольким столбцам, чтобы движок находил строки без сканирования всей таблицы. Он меняет память и скорость записи на гораздо более быстрое чтение.
Типичные ошибки
- ✗Считать, что индекс ускоряет запись, а не чтение
- ✗Путать индекс с первичным ключом
- ✗Забывать про компромисс памяти и стоимости записи
Уточняющие вопросы
- →Почему индекс ускоряет чтение, но замедляет запись?
- →По какому столбцу индекс полезнее всего?
JuniorТеорияЧастоЧто такое нормальная форма и зачем нужна нормализация?
Что такое нормальная форма и зачем нужна нормализация?
Нормальная форма — это свойство отношения, описывающее степень его избыточности, и набор требований к структуре. Нормализация убирает дублирование и аномалии вставки, обновления и удаления, разбивая таблицы. Денормализация возвращает избыточность ради чтения.
Типичные ошибки
- ✗Называть нормальную форму форматом файла или способом хранения
- ✗Думать, что нормализация сливает таблицы, а не разбивает их
- ✗Не знать, что нормализация убирает аномалии обновления/вставки/удаления
Уточняющие вопросы
- →Что требует первая нормальная форма?
- →Когда осознанно идут на денормализацию?
MiddleТеорияЧастоКакие констрейнты есть в реляционной БД и как задать уникальность по нескольким полям?
Какие констрейнты есть в реляционной БД и как задать уникальность по нескольким полям?
Констрейнты дают целостность на уровне схемы: PRIMARY KEY идентифицирует строку, FOREIGN KEY держит ссылочную целостность, UNIQUE запрещает дубли, NOT NULL требует значение, CHECK проверяет условие. Уникальность по нескольким столбцам даёт составной UNIQUE.
Типичные ошибки
- ✗Называть только PRIMARY KEY, опуская CHECK или NOT NULL
- ✗Думать, что констрейнты относятся к приложению, а не к схеме
- ✗Не знать, что составную уникальность даёт многостолбцовый UNIQUE/индекс
Уточняющие вопросы
- →Чем UNIQUE отличается от PRIMARY KEY?
- →Какой констрейнт проверяет диапазон значения?
SeniorТеорияЧастоКакими способами масштабируют реляционную БД и в чём разница между ними?
Какими способами масштабируют реляционную БД и в чём разница между ними?
Вертикальное масштабирование добавляет ресурсы одному серверу — просто, но ограничено. Репликация копирует данные на реплики (синхронная консистентна, но медленнее; асинхронная быстрее, но отстаёт) и масштабирует чтение. Шардирование разбивает строки по ключу.
Типичные ошибки
- ✗Путать вертикальное масштабирование (мощнее сервер) с шардированием (разбиение строк)
- ✗Утверждать, что у асинхронной репликации нет отставания или у синхронной нет цены
- ✗Забывать, что шардирование усложняет соединения и транзакции между шардами
Уточняющие вопросы
- →Чем синхронная репликация отличается от асинхронной по гарантиям?
- →Как выбор ключа шарда влияет на распределение нагрузки?
SeniorТеорияЧастоКакие семейства NoSQL-баз вы знаете и под какие задачи каждое?
Какие семейства NoSQL-баз вы знаете и под какие задачи каждое?
Четыре семейства NoSQL: ключ-значение даёт быстрый поиск по ключу для кэшей и сессий; документоориентированное хранит вложенные документы; колоночное подходит для аналитических записей; графовое хранит узлы и рёбра для связанных данных. Выбор — по паттерну доступа.
Типичные ошибки
- ✗Называть только ключ-значение, упуская документ/колоночное/граф
- ✗Сопоставлять семейство не той нагрузке (ключ-значение для обхода графа)
- ✗Выбирать семейство по популярности, а не по паттерну доступа
Уточняющие вопросы
- →Какое семейство выберете для социального графа и почему?
- →Чем документоориентированная база удобнее реляционной для вложенных сущностей?
JuniorТеорияИногдаЧто такое транзакция в реляционной БД и любая ли операция — транзакция?
Что такое транзакция в реляционной БД и любая ли операция — транзакция?
Транзакция — это один или несколько SQL-операторов как единая логическая задача, неделимое действие, которое либо целиком фиксируется, либо целиком откатывается. Она завершается COMMIT или ROLLBACK. Одиночный оператор тоже идёт в неявной транзакции.
Типичные ошибки
- ✗Считать, что транзакцию можно зафиксировать частично
- ✗Забывать COMMIT и ROLLBACK как два завершения
- ✗Думать, что транзакции — только многооператорные блоки
Уточняющие вопросы
- →Что произойдёт при сбое до COMMIT?
- →Чем COMMIT отличается от ROLLBACK?
MiddleТеорияИногдаЧто ухудшается от индекса, что такое уникальный индекс и по какому полю (id/Пол) индекс бесполезен?
Что ухудшается от индекса, что такое уникальный индекс и по какому полю (id/Пол) индекс бесполезен?
Индекс замедляет INSERT/UPDATE/DELETE, ведь его нужно поддерживать, и стоит дополнительной памяти. Уникальный индекс ещё и запрещает дублирующиеся значения ключа. Индекс по «Пол» почти бесполезен: два значения дают низкую селективность; «id» селективнее.
Типичные ошибки
- ✗Индексировать низкокардинальный столбец вроде пола в надежде на ускорение
- ✗Забывать, что индексы замедляют запись и стоят памяти
- ✗Путать уникальный индекс с обычным
Уточняющие вопросы
- →Что такое селективность индекса?
- →Как уникальный индекс обеспечивает уникальность по нескольким полям?
MiddleТеорияИногдаЧто такое партиционирование таблицы, где и зачем его применяют?
Что такое партиционирование таблицы, где и зачем его применяют?
Партиционирование разбивает одну большую логическую таблицу на меньшие физические секции по ключу — например, диапазону дат, — но для запросов она остаётся единой. Сканируются лишь нужные партиции, а партицию целиком можно удалить при обслуживании.
Типичные ошибки
- ✗Путать партиционирование с индексированием
- ✗Думать, что запрос обязан сканировать все партиции независимо от ключа
- ✗Применять его к малым таблицам без естественного ключа партиционирования
Уточняющие вопросы
- →Чем партиционирование отличается от шардирования?
- →По какому ключу обычно партиционируют большую таблицу логов?
MiddleТеорияИногдаКакие аномалии возникают при параллельных транзакциях и как от них защищаются?
Какие аномалии возникают при параллельных транзакциях и как от них защищаются?
Аномалии параллелизма: потерянная запись (транзакции затирают друг друга), грязное чтение (чтение незакоммиченных данных), неповторяющееся чтение (другие значения при повторе) и фантомы (больше или меньше строк). Защита — уровни изоляции через блокировки или MVCC.
Типичные ошибки
- ✗Путать неповторяющееся чтение (изменена строка) с фантомом (изменено число строк)
- ✗Называть грязным чтением чтение закоммиченных данных
- ✗Забывать, что защита — уровни изоляции (блокировки/MVCC)
Уточняющие вопросы
- →Чем неповторяющееся чтение отличается от фантома?
- →Какой уровень изоляции устраняет грязное чтение?
SeniorТеорияИногдаКак понять, что таблице нужен индекс, какие рекомендации при создании и какова типичная структура индекса?
Как понять, что таблице нужен индекс, какие рекомендации при создании и какова типичная структура индекса?
Индекс нужен, когда столбец участвует в частом поиске, фильтрации или соединениях на большой читаемой таблице; нужду подтверждают планом запроса. Индексируйте внешние ключи и столбцы в JOIN/WHERE, предпочитайте составные индексы. Типичная структура — B-дерево.
Типичные ошибки
- ✗Чрезмерно индексировать пишущие таблицы, игнорируя стоимость записи
- ✗Игнорировать порядок столбцов в составном индексе
- ✗Решать об индексах без чтения планов запросов
Уточняющие вопросы
- →Почему порядок столбцов в составном индексе важен?
- →Когда hash-индекс предпочтительнее B-дерева?
MiddleТеорияРедкоЧем различаются концептуальный, логический и физический уровни модели данных?
Чем различаются концептуальный, логический и физический уровни модели данных?
Концептуальная модель называет бизнес-сущности и их связи, без привязки к технологии. Логическая добавляет атрибуты, ключи и типы связей, но остаётся независимой от СУБД. Физическая отображает её на конкретную СУБД: таблицы, столбцы, типы данных, индексы.
Типичные ошибки
- ✗Класть СУБД-специфичные типы данных в концептуальную или логическую модель
- ✗Путать порядок — строить физическую до концептуальной
- ✗Думать, что типы связей/ключей относятся лишь к одному уровню
Уточняющие вопросы
- →На каком уровне появляется тип связи многие-ко-многим?
- →Чем уровни моделирования отличаются от уровней представления данных?