
Информатика: создаём своего цифрового помощника Урок 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 и неизменные напоминания. Запишите оставшийся непонятным термин и вернитесь к его первому определению.
Первоисточник для проверки
Следующий урок
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.