Перейти к содержимому
шпаргалка.
Esc
навигацияоткрыть⌘Jпредпросмотр
На этой странице

Базы данных

Все темы С# Developer

Разница между реляционными и нереляционными базами, плюсы и минусы использования обоих вариантов

Реляционные базы данных (SQL):

Преимущества:

  • Строгая схема: Четко определенная структура данных.

  • SQL: Мощный язык запросов.

  • Нормализация: Минимизация дублирования данных.

  • Транзакции: Поддержка ACID-транзакций.

Недостатки:

  • Масштабируемость: Трудности с горизонтальным масштабированием.

  • Сложность схемы: Изменение схемы может быть трудоемким.

  • Производительность: Может снижаться при больших объемах данных.

Нереляционные базы данных (NoSQL):

Преимущества:

  • Гибкость схемы: Схема может быть динамической или отсутствовать.

  • Масштабируемость: Легче горизонтально масштабировать.

  • Производительность: Высокая производительность для определенных типов нагрузок.

Недостатки:

  • Отсутствие стандартизации: Разные модели данных и интерфейсы.

  • Ограниченные возможности запросов: Менее мощные средства для сложных запросов.

  • Последовательность: Некоторые NoSQL базы данных могут не поддерживать полные ACID-транзакции.

Итог:

  • Реляционные: Хорошо подходят для приложений с четко определенной структурой данных и необходимостью в сложных запросах и транзакциях.

  • Нереляционные: Идеальны для больших объемов данных, требующих гибкой схемы и высокой производительности при горизонтальном масштабировании.


Что такое индексы в RDBMS?

Индексы в RDBMS:

  • Определение: Специальные структуры, создаваемые в базах данных для быстрого поиска и доступа к данным.

  • Назначение: Улучшение скорости выполнения запросов (SELECT), особенно на больших таблицах.

  • Типы:
    • Кластерные (Clustered): Сортируют и хранят строки данных таблицы на основе ключевых значений индекса.

    • Некластерные (Non-Clustered): Создают отдельную структуру, указывающую на физические строки данных.

Преимущества:

  • Повышение производительности: Значительно ускоряют операции поиска.

  • Быстрое выполнение: Улучшают скорость выполнения запросов на выборку.

Недостатки:

  • Затраты на обновление: Замедляют операции вставки, обновления и удаления данных.

  • Использование памяти: Требуют дополнительного пространства для хранения индексных структур.


Какие типы JOIN существуют в SQL?

В SQL существует несколько типов JOIN:

  1. INNER JOIN: Возвращает только те строки, которые имеют совпадающие значения в обеих таблицах.

    SELECT * FROM table1
    INNER JOIN table2 ON table1.id = table2.id;
  2. LEFT JOIN (LEFT OUTER JOIN): Возвращает все строки из левой таблицы и совпадающие строки из правой таблицы. Если совпадений нет, возвращает NULL для правой таблицы.

    SELECT * FROM table1
    LEFT JOIN table2 ON table1.id = table2.id;
  3. RIGHT JOIN (RIGHT OUTER JOIN): Возвращает все строки из правой таблицы и совпадающие строки из левой таблицы. Если совпадений нет, возвращает NULL для левой таблицы.

    SELECT * FROM table1
    RIGHT JOIN table2 ON table1.id = table2.id;
  4. FULL JOIN (FULL OUTER JOIN): Возвращает все строки, когда есть совпадение в одной из таблиц. Если совпадений нет, возвращает NULL для не совпадающей таблицы.

    SELECT * FROM table1
    FULL JOIN table2 ON table1.id = table2.id;
  5. CROSS JOIN: Возвращает декартово произведение всех строк двух таблиц.

    SELECT * FROM table1
    CROSS JOIN table2;

Расскажите о нормальных формах в СУБД

Нормальные формы в СУБД (системах управления базами данных) используются для структурирования баз данных с целью минимизации избыточности и предотвращения аномалий при обновлении данных. Основные нормальные формы включают:

  1. Первая нормальная форма ( 1NF ):
    • Требование: Все столбцы содержат только атомарные (неделимые) значения, и каждое значение в столбце однотипно.

    • Пример: Таблица без повторяющихся групп.

  2. Вторая нормальная форма ( 2NF ):
    • Требование: Таблица находится в 1NF и все неключевые столбцы зависят от всего первичного ключа (отсутствие частичных зависимостей).

    • Пример: Таблица, где каждый неключевой столбец зависит от первичного ключа целиком.

  3. Третья нормальная форма ( 3NF ):
    • Требование: Таблица находится во 2NF и все неключевые столбцы не зависят транзитивно от первичного ключа (отсутствие транзитивных зависимостей).

    • Пример: Таблица, где неключевые столбцы зависят только от первичного ключа.

  4. Бойс-Кодд нормальная форма ( BCNF ):
    • Требование: Таблица находится в 3NF и для каждой функциональной зависимости X -> Y, X является суперключом.

    • Пример: Укрепляет 3NF, устраняя некоторые аномалии, не решаемые 3NF.

  5. Четвёртая нормальная форма ( 4NF ):
    • Требование 4NF: в каждой нетривиальной многозначной зависимости X ↠ Y детерминант X должен быть суперключом. Тривиальные зависимости не запрещены.

    • Пример: Таблица, где один факт не приводит к нескольким независимым многозначным зависимостям.

  6. Пятая нормальная форма ( 5NF ):
    • Требование 5NF: каждая нетривиальная зависимость соединения должна следовать из кандидатных ключей.

    • Смысл 5NF: устранить избыточность, связанную с зависимостями соединения; разложение должно позволять восстановить исходное отношение соединением без потерь и лишних строк.


Что такое индекс в БД?

Индекс в базе данных:

  • Определение: Структура данных, созданная для ускорения поиска и доступа к строкам в таблице.

  • Назначение: Повышение производительности операций выборки (SELECT).

Типы индексов:

  • Кластерные ( Clustered ): Физически сортируют строки данных таблицы на основе ключа индекса. Каждая таблица может иметь только один кластерный индекс.

  • Некластерные ( Non-Clustered ): Хранят указатели на физические строки данных. Одна таблица может иметь множество некластерных индексов.

Преимущества:

  • Ускорение запросов: Значительно увеличивают скорость выполнения запросов на выборку данных.

Недостатки:

  • Затраты на обновление: Замедляют операции вставки, обновления и удаления из-за необходимости обновления индекса.

  • Использование памяти: Требуют дополнительного пространства для хранения индексных структур.


Когда следует использовать индексы? Преимущества и недостатки

Когда следует использовать индексы:

  • Частые запросы: Для столбцов, которые часто используются в условиях WHERE, JOIN, ORDER BY и GROUP BY.

  • Уникальность: Для обеспечения уникальности значений в столбце (например, первичные ключи).

  • Ускорение поиска: Для ускорения поиска и доступа к данным в больших таблицах.

Преимущества:

  • Ускорение выполнения запросов: Значительно повышают скорость выборки данных.

  • Упорядочение данных: Кластерные индексы упорядочивают физическое хранение данных, что ускоряет доступ.

Недостатки:

  • Замедление операций записи: Вставка, обновление и удаление данных становятся медленнее из-за необходимости обновления индексов.

  • Использование памяти: Индексы занимают дополнительное пространство на диске.


Какие типы индексов существуют? Чем они отличаются?

Типы индексов в базе данных:

  1. Кластерные индексы ( Clustered Index ):
    • Описание: Физически сортируют строки данных таблицы на основе ключа индекса.

    • Отличие: Таблица может иметь только один кластерный индекс. Данные хранятся в порядке кластерного ключа.

    • Пример: Первичный ключ автоматически создаёт кластерный индекс, если не указано иное.

  2. Некластерные индексы ( Non-Clustered Index ):
    • Описание: Создают отдельную структуру, содержащую указатели на физические строки данных.

    • Отличие: Таблица может иметь множество некластерных индексов. Не сортируют физически данные.

    • Пример: Индексы для ускорения поиска по неключевым столбцам.

  3. Уникальные индексы ( Unique Index ):
    • Описание: Гарантируют уникальность значений в столбце.

    • Отличие: Не допускают дублирующихся значений в индексируемых столбцах.

    • Пример: Индексы на столбцах с уникальными ограничениями.

  4. Полнотекстовые индексы ( Full-Text Index ):
    • Описание: Используются для текстового поиска в больших текстовых столбцах.

    • Отличие: Обеспечивают быстрое выполнение полнотекстовых поисковых запросов.

    • Пример: Поиск по документам, описаниям или другим текстовым данным.

  5. Составные индексы ( Composite Index ):
    • Описание: Индексы, созданные на основе нескольких столбцов.

    • Отличие: Учитывают комбинацию значений нескольких столбцов для индексации.

    • Пример: Индексы на сочетание столбцов “Фамилия” и “Имя”.

Отличия:

  • Кластерные vs Некластерные: Кластерные сортируют данные физически, некластерные — логически.

  • Уникальные: Гарантируют уникальность значений.

  • Полнотекстовые: Оптимизированы для текстового поиска.

  • Составные: Индексируют комбинации значений нескольких столбцов.


Что такое ACID?

ACID — это набор свойств, обеспечивающих надежность транзакций в базе данных:

  1. Atomicity (Атомарность):
    • Определение: Транзакция выполняется полностью или не выполняется вовсе.

    • Пример: Если часть транзакции не удалась, все изменения отменяются.

  2. Consistency (Согласованность):
    • Определение: Транзакция переводит базу данных из одного согласованного состояния в другое.

    • Пример: Все правила и ограничения (такие как целостность данных) соблюдаются.

  3. Isolation (Изоляция):
    • Определение: изоляция ограничивает влияние конкурентных транзакций. Допустимые наблюдаемые эффекты зависят от уровня изоляции; Serializable дает результат, эквивалентный некоторому последовательному выполнению.

    • Пример: Одновременные транзакции не влияют друг на друга.

  4. Durability (Устойчивость):
    • Определение: После завершения транзакции ее результаты сохраняются, даже в случае сбоя системы.

    • Пример: Записанные данные остаются сохраненными после подтверждения транзакции.


Проблема: запрос долго выполняется. Какие есть методы ее диагностики и решения?

Методы диагностики:
  1. Анализ плана выполнения ( Execution Plan ):
    • Инструмент: Используйте SQL Server Management Studio (SSMS) или аналогичные инструменты.

    • Описание: Показать, как база данных выполняет запрос, выявляя узкие места.

  2. Индексация:
    • Проверка: Проверьте наличие и эффективность индексов.

    • Создание/Обновление: Создайте или обновите индексы на ключевых столбцах.

  3. Статистика:
    • Обновление: Убедитесь, что статистика актуальна.

    • Команда: UPDATE STATISTICS или аналогичные команды для обновления.

  4. Профилирование (Profiling):
    • Инструмент: Используйте SQL Profiler или аналогичные инструменты.

    • Описание: Отслеживайте и анализируйте запросы, чтобы выявить медленные.

Методы решения:
  1. Оптимизация запросов:
    • Переписать: найдите узкое место по плану и измерениям. JOIN не всегда быстрее подзапроса; оптимизатор может построить одинаковый план.

    • Разделение: Разделите сложные запросы на несколько более простых.

  2. Индексы:
    • Добавить: Добавьте недостающие индексы.

    • Удалить: Удалите неиспользуемые или дублирующиеся индексы.

  3. Кеширование:
    • Внедрение: Используйте кеширование часто запрашиваемых данных.

    • Проверка: Убедитесь, что кеширование актуально и эффективно.

  4. Аппаратные ресурсы:
    • Обновление: Проверьте нагрузку на сервер и, если необходимо, обновите аппаратные ресурсы (CPU, RAM, диск).
  5. Параллелизм:
    • Настройка: Настройте параметры параллелизма для улучшения производительности многоядерных систем.

Как ORM (Entity Framework или Entity Framework Core) транслируют C# код в язык запросов базы данных? Что для этого используется?

Как ORM транслируют C# код в язык запросов базы данных:

  1. LINQ (Language Integrated Query):
    • Описание: Используется для написания запросов к базе данных на C#.

    • Пример: var users = context.Users.Where(u => u.IsActive).ToList();
  2. Компилятор выражений (Expression Trees):
    • Описание: LINQ-запросы переводятся в дерево выражений, представляющее структуру запроса.

    • Пример: Expression<Func<User, bool>> filter = u => u.IsActive;
  3. Провайдеры LINQ (LINQ Providers):
    • Описание: Провайдер LINQ для Entity Framework обрабатывает дерево выражений и генерирует соответствующий SQL-запрос.

    • Пример: Генерация SQL-кода: SELECT * FROM Users WHERE IsActive = 1;

  4. Исполнение запроса:
    • Описание: Сформированный SQL-запрос отправляется в базу данных для выполнения.

    • Пример: перечисление LINQ-запроса или ToListAsync() заставляет EF Core отправить SQL и материализовать результаты. ExecuteSqlRaw служит для отдельного выполнения SQL-команд и не является внутренним шагом LINQ-запроса.

Используемые компоненты:

  • LINQ: Для написания запросов на C#.

  • Expression Trees: Для представления структуры запроса.

  • LINQ Provider: Для генерации SQL-запросов.

  • Entity Framework: Для взаимодействия с базой данных и выполнения запросов.


Какие вы знаете уровни изоляции транзакций?

Уровни изоляции транзакций:

  1. Read Uncommitted (Чтение неподтвержденных данных):
    • Описание: Транзакция может читать данные, измененные другими транзакциями, даже если они не завершены.

    • Проблемы: Грязное чтение (dirty reads).

  2. Read Committed (Чтение подтвержденных данных):
    • Описание: Транзакция может читать только данные, которые были подтверждены другими транзакциями.

    • Проблемы: Неповторяющееся чтение (non-repeatable reads).

  3. Repeatable Read (Повторяемое чтение):
    • Описание: Транзакция гарантирует, что данные, прочитанные однажды, не изменятся до ее завершения.

    • Проблемы: Фантомное чтение (phantom reads).

  4. Serializable (Сериализуемый):
    • Описание: результат эквивалентен некоторому последовательному выполнению транзакций. Фактически они могут выполняться конкурентно; конфликт может привести к откату и необходимости повтора.

    • Проблемы: Наиболее строгий уровень, исключает фантомные чтения, но может снижать производительность из-за блокировок.

Эта страница была полезной?