Курсовая работа

Курсовая по базам данных: как спроектировать схему, ограничения и запросы так, чтобы данные не разрушались при работе системы

Как написать курсовую по базам данных: описать предметную область, построить ER-модель, нормализовать схему, задать ограничения, запросы, индексы и транзакции.

К содержанию
Содержание +

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

Слабая работа часто начинается с создания таблиц в СУБД. Сильная - с понимания предметной области и правил, которые база обязана сохранять.

Предметная область

Сначала перечислите реальные сущности.

Например, для библиотеки:

  • книга;
  • экземпляр;
  • автор;
  • читатель;
  • выдача.

Не смешивайте книгу как произведение и физический экземпляр.

Это разные сущности с разными атрибутами.

Бизнес-правила

Запишите правила словами.

Например:

  • один экземпляр одновременно не может быть выдан двум читателям;
  • у книги может быть несколько авторов;
  • одна выдача относится к одному экземпляру;
  • дата возврата не может быть раньше даты выдачи.

Эти правила потом превращаются в ограничения.

ER-модель

Для каждой связи определите кардинальность.

Варианты:

  • один к одному;
  • один ко многим;
  • многие ко многим.

Связь многие ко многим обычно требует промежуточной сущности.

Не храните список авторов в одном текстовом поле.

Ключ

У каждой таблицы должен быть первичный ключ.

Он может быть естественным или суррогатным.

Выбор зависит от стабильности и смысла.

Не используйте изменяемое имя человека как главный идентификатор.

Внешний ключ

Он поддерживает ссылочную целостность.

Если выдача ссылается на экземпляр, база должна предотвращать ссылку на несуществующий объект.

Не оставляйте такую проверку только в приложении.

Нормализация

Она уменьшает избыточность.

Проверьте повторяющиеся группы, зависимость от части ключа и транзитивные зависимости.

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

Схема должна оставаться удобной для реальных запросов.

Первая нормальная форма

В одном поле хранится одно логическое значение.

Список телефонов через запятую удобен для отображения, но плохо подходит для поиска, ограничения и обновления.

Если телефоны являются самостоятельными данными, выделите структуру.

Функциональные зависимости

Запишите, от чего зависит атрибут.

Например:

order_id -> order_date, customer_id.

Если название клиента повторяется в каждой строке заказа, возникает риск несогласованности.

Так теория нормализации связывается с практикой.

Денормализация

Иногда она оправдана производительностью.

Но сначала измерьте проблему.

Не дублируйте данные заранее «для скорости».

Если значение хранится в двух местах, нужен механизм синхронизации.

Тип данных

Выбирайте тип по смыслу.

Дата должна быть датой.

Деньги не всегда стоит хранить float.

Телефон не является числом для арифметики.

Не используйте VARCHAR для всех полей ради простоты.

NULL

Поймите, что означает отсутствие значения.

NULL может быть неизвестно, не задано или не применимо.

Не используйте пустую строку, 0 и NULL как взаимозаменяемые варианты.

Это усложняет запросы.

CHECK

Ограничение может запретить невозможное значение.

Например:

  • количество >= 0;
  • дата окончания >= даты начала;
  • статус из допустимого списка.

Это надёжнее, чем надеяться, что интерфейс никогда не отправит ошибку.

UNIQUE

Уникальность нужна для реального правила.

Например:

  • логин;
  • внешний номер;
  • комбинация нескольких полей.

Не ставьте UNIQUE на фамилию или название товара без понимания предметной области.

Каскадное удаление

ON DELETE CASCADE удобно, но опасно.

Покажите, что именно должно происходить при удалении родительской записи.

Иногда правильнее запретить удаление.

Не включайте каскад для всех связей автоматически.

Транзакция

Если одна бизнес-операция меняет несколько таблиц, она должна завершиться целиком.

Например:

1. создать платёж;
2. изменить баланс;
3. записать движение.

Если второй шаг упал, первый не должен остаться отдельно.

Это классический случай транзакции.

Уровень изоляции

Для сложной работы можно разобрать dirty read, non-repeatable read и phantom read.

Но не перечисляйте уровни изоляции без сценария.

Покажите, какую аномалию нужно предотвратить.

Блокировки

Параллельные операции могут конфликтовать.

Например, два пользователя одновременно покупают последний товар.

Нужно продумать, как база обеспечивает корректность.

Не решайте гонку простой проверкой остатка до UPDATE без атомарности.

Запросы

Подберите реальные запросы:

  • выборка;
  • фильтр;
  • агрегат;
  • JOIN;
  • подзапрос;
  • оконная функция, если уместно.

Не демонстрируйте SQL только ради количества операторов.

Каждый запрос должен отвечать бизнес-вопросу.

JOIN

Понимайте разницу между INNER и LEFT JOIN.

Неправильный тип соединения может тихо потерять строки.

Проверяйте количество до и после объединения.

Агрегация

GROUP BY удобен, но может создавать ошибочный результат при неправильном уровне детализации.

Определите, по чему группируете:

  • клиент;
  • день;
  • товар;
  • магазин.

Не смешивайте поля разных уровней без логики.

Индекс

Создавайте под запрос.

Кандидаты:

  • внешний ключ;
  • частый фильтр;
  • сортировка;
  • составной поиск.

Индекс ускоряет чтение, но замедляет изменение и занимает место.

Не индексируйте каждый столбец.

Составной индекс

Порядок полей важен.

Если запрос фильтрует сначала по user_id, затем по date, индекс может быть построен под этот шаблон.

Проверяйте план выполнения, а не угадывайте.

EXPLAIN

Он показывает, как СУБД выполняет запрос.

Сравните до и после индекса.

Не оценивайте оптимизацию только по времени одного запуска на маленькой таблице.

Объём данных

Для эксперимента заполните базу реалистичным количеством записей.

На 20 строках почти любой запрос быстрый.

Если тема производительность, генерируйте больше данных.

Резервное копирование

Если курсовая включает эксплуатацию, опишите backup, восстановление и периодичность.

Важно проверить восстановление.

Файл резервной копии без теста восстановления не даёт полной уверенности.

Миграция

Изменение схемы должно быть воспроизводимым.

Например, новая версия добавляет столбец и заполняет его.

Не изменяйте структуру вручную без фиксации миграции.

Защита

Покажите:

1. предметную область;
2. ER-модель;
3. бизнес-правило;
4. ограничение;
5. запрос;
6. индекс;
7. транзакцию.

Курсовая по базам данных выглядит профессионально тогда, когда схема не просто хранит данные, а сама помогает сохранять их целостность и поддерживает реальные сценарии работы системы.

Ещё по теме