Проектирование и моделирование баз данных (Средний/Продвинутый уровень)
Объясните разницу между 3NF (Третья нормальная форма) и BCNF (Нормальная форма Бойса-Кодда). Когда следует выбирать одно вместо другого?
Ответ:
3NF устраняет транзитивные зависимости, в то время как BCNF устраняет все функциональные зависимости, где детерминанта не является суперключом. BCNF является более строгой формой 3NF. Выбирайте BCNF для более высокой целостности данных, если таблица имеет перекрывающиеся кандидатные ключи или если неключевой атрибут определяет часть кандидатного ключа. В противном случае 3NF часто бывает достаточной и менее сложной в достижении.
Что такое денормализация и когда ее уместно использовать? Приведите пример.
Ответ:
Денормализация — это процесс намеренного внесения избыточности в базу данных для улучшения производительности чтения, часто путем объединения данных из нескольких таблиц в одну. Она уместна, когда производительность чтения критически важна, а накладные расходы на соединения слишком высоки, или для отчетности/хранилищ данных. Пример: хранение 'customer_name' непосредственно в таблице 'orders', даже если оно существует в 'customers'.
Опишите концепцию суррогатного ключа по сравнению с естественным ключом. Каковы преимущества и недостатки каждого?
Ответ:
Суррогатный ключ — это искусственно сгенерированный уникальный идентификатор (например, автоинкрементное целое число), в то время как естественный ключ выводится из самих бизнес-данных (например, ISBN для книги). Суррогатные ключи обеспечивают простоту, стабильность (никогда не меняются) и производительность. Естественные ключи несут бизнес-смысл, но могут быть сложными, меняться со временем и быть составными. Суррогатные ключи обычно предпочтительнее для первичных ключей.
Объясните разницу между схемой "звезда" и схемой "снежинка" в хранилищах данных.
Ответ:
Схема "звезда" имеет центральную таблицу фактов, окруженную денормализованными таблицами измерений. Она проще, быстрее для запросов и легче для понимания. Схема "снежинка" нормализует таблицы измерений в несколько связанных таблиц, образуя структуру, похожую на снежинку. Она уменьшает избыточность данных, но увеличивает сложность запросов из-за большего количества соединений.
Что такое индекс и как он улучшает производительность запросов? Когда индекс может быть вреден?
Ответ:
Индекс — это структура данных, которая улучшает скорость операций извлечения данных из таблицы базы данных. Он работает путем создания отсортированного списка значений из одного или нескольких столбцов, позволяя базе данных быстро находить строки без сканирования всей таблицы. Индексы могут быть вредны во время операций записи (INSERT, UPDATE, DELETE), поскольку их необходимо обновлять, что увеличивает накладные расходы и потребление дискового пространства.
Обсудите компромиссы между проектированием баз данных OLTP (Online Transaction Processing) и OLAP (Online Analytical Processing).
Ответ:
Системы OLTP оптимизированы для высокообъемных, параллельных, коротких транзакций (вставки, обновления, удаления), уделяя особое внимание целостности данных и нормализации. Системы OLAP оптимизированы для сложных аналитических запросов по большим наборам данных, отдавая приоритет производительности чтения и часто используя денормализованные схемы (звезда/снежинка). Они обслуживают разные бизнес-потребности, что приводит к различным философским подходам к проектированию.
Как обрабатывать отношения "многие ко многим" при проектировании реляционной базы данных? Приведите пример.
Ответ:
Отношения "многие ко многим" обрабатываются путем введения промежуточной (или "связующей"/"ассоциативной") таблицы. Эта таблица содержит внешние ключи, ссылающиеся на первичные ключи двух связанных таблиц, образуя составной первичный ключ. Пример: "Студенты" и "Курсы" имеют отношение "многие ко многим", которое решается таблицей 'StudentCourses' с полями 'student_id' и 'course_id'.
Что такое целостность данных и какие механизмы используются для ее обеспечения в базе данных?
Ответ:
Целостность данных относится к точности, согласованности и надежности данных на протяжении всего их жизненного цикла. Механизмы для ее обеспечения включают: Целостность сущностей (Первичные ключи, обеспечивающие уникальность строк), Ссылочную целостность (Внешние ключи, поддерживающие связи между таблицами), Целостность домена (ограничения CHECK, типы данных, обеспечивающие допустимые значения) и Пользовательскую целостность (Триггеры, хранимые процедуры для сложных бизнес-правил).
Объясните концепцию "покрывающего индекса" (covering index). Как он улучшает производительность запросов?
Ответ:
Покрывающий индекс — это индекс, который включает все столбцы, необходимые для запроса, что означает, что база данных может извлечь все необходимые данные непосредственно из индекса, не обращаясь к фактическим строкам таблицы. Это значительно улучшает производительность за счет уменьшения дискового ввода-вывода, поскольку запрос может быть полностью удовлетворен путем сканирования индекса.
При проектировании базы данных, как решить, какие атрибуты должны быть частью составного первичного ключа, а какие — отдельными атрибутами?
Ответ:
Составной первичный ключ используется, когда уникальность записи не может быть гарантирована одним атрибутом, но требует комбинации двух или более. Вы решаете на основе естественной уникальности сущности. Если отдельные атрибуты не являются уникальными по своей природе, но их комбинация является, то составной ключ подходит. В противном случае лучше использовать отдельные атрибуты или суррогатный ключ.