Shanraq.org Shanraq.org
Связанные таблицы, ключи и отсутствие дублей
Общество

Информатика: создаём своего цифрового помощника Урок 51 из 72

Связанные таблицы, ключи и отсутствие дублей

Свяжем задачи и занятия ключом так, чтобы ни одна запись не указывала в пустоту.

Где мы на карте

Урок 51 из 72, блок «Данные, таблицы и базы» (47–54). Мы продолжаем помощника 1.1 с тремя вымышленными задачами. В конце блока его записи будут храниться в локальном SQLite, а проверенные правила напоминаний останутся прежними.

Связанные таблицы, ключи и отсутствие дублей

Ситуация и вопрос

Если в каждую строку занятий переписывать название «Кітап оқу», ошибка в одном символе создаст будто бы новую задачу. Хранить название один раз и ссылаться на ID надёжнее.

Новые слова без пропусков

База данных — организованное хранилище с правилами чтения и записи. Реляционная таблица описывает один вид сущностей: у нас tasks и study_sessions. Первичный ключ уникален в таблице: task_id либо session_id. Внешний ключ study_sessions.task_id требует существующей задачи. Связь один ко многим означает: одна задача может иметь много занятий; каждое занятие относится к одной задаче. NULL в дате означает «дата не назначена», а не пустую строку и не нулевой день.

Опорный сигнал

Прочитайте схему слева направо. Для каждой стрелки назовите вход, преобразование и проверку. Закройте третий шаг и предскажите его. Затем найдите соответствующую строку в CSV, SQL или отчёте: нарисованная стрелка не должна подменять реальные значения и связи.

Разбираем шаг за шагом

Нарисуйте три задачи слева и четыре занятия справа. Стрелки: s-01 и s-02 к t-01, s-03 и s-04 к t-03; у t-02 стрелок нет. Создайте две таблицы SQLite с первичными ключами и REFERENCES tasks(task_id). Для каждого соединения Python включайте PRAGMA foreign_keys = ON: SQLite не следует считать включившим эту проверку автоматически. Попытка вставить t-99 должна завершиться ошибкой.

Предскажите и проверьте

Сначала запишите ожидаемый вывод точно, включая порядок строк. Затем выполните код из папки step-05 и сравните посимвольно. Измените один вход и повторите цикл «предсказать — запустить — объяснить». Пример доказывает только заявленное правило: он не превращает учебные вымышленные данные в измерение реальных людей.

import sqlite3
db = sqlite3.connect(":memory:")
db.execute("PRAGMA foreign_keys = ON")
db.execute("CREATE TABLE tasks (task_id TEXT PRIMARY KEY)")
db.execute("CREATE TABLE sessions (task_id TEXT REFERENCES tasks(task_id))")
print(db.execute("PRAGMA foreign_keys").fetchone()[0])
db.close()

Ожидаемый вывод

1

Поймайте ошибку

Не путайте одинаковый task_id в двух занятиях с дублем: это разрешённая связь. Дубль здесь — повторный session_id или повторная задача с тем же task_id. Проверка внешних ключей действует только на соединениях, где она включена.

Изменение проекта

В step-05/data_store.py хранятся две таблицы, ограничения и индекс для поиска занятий по задаче. Импорт проходит в новом временном файле: если проверка не завершилась, готовая база не появляется.

Задание и доказательство

Подпишите ключи на схеме. Попробуйте мысленно добавить s-05,t-99: какое правило сработает? Затем назовите, почему у t-02 может не быть занятий и почему это не ошибка связи.

Перенос в новую ситуацию

В библиотеке есть таблицы books и loans. Где должен находиться внешний ключ, если одна книга может выдаваться много раз? Какая строка недопустима?

Возврат через 1, 7 и 30 дней

Через 1 день восстановите схему по памяти и назовите случай, где простая аналогия не работает. Через 7 дней объясните новую таблицу товарищу без текста и ответьте минимум на 7 из 10 вопросов итогового урока. Через 30 дней повторите импорт во временную папку и проверьте три задачи, четыре занятия, сумму 70 и неизменные напоминания. Запишите оставшийся непонятным термин и вернитесь к его первому определению.

Первоисточник для проверки

Официальная документация

Следующий урок

SQL спрашивает данные точно

Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом

Проверить доказательство проекта

Запишите наблюдение, объяснение, исправление ошибки и изменение своего проекта. Модель укажет первую перепутанную или недоказанную связь, но не даст готовый ответ.

Чтобы проверить, нужно войти. Войти

Комментарии (0)

Пока нет комментариев. Будьте первым.