
Таблица, строка, столбец и NULL: сначала модель бюджета
Разбираем четыре сущности проекта — счета, категории, операции и лимиты — и учимся отличать отсутствие значения от нуля. До синтаксиса важно понять, какой факт хранит каждая строка.
Зачем это нужно
Плохая модель заставляет каждый запрос угадывать смысл данных. Если в одной ячейке написано Еда / карта / 49800, человеку ещё понятно, а базе неизвестно, где категория, где счёт и где сумма.
Образ. Одна строка — одно законченное предложение.
Операция 7 произошла 10 сентября, со счёта Карта, в категории Транспорт, на 6800 тенге. Если строка рассказывает сразу о нескольких разных событиях, её трудно проверить.
Сразу целиком
SELECT id, happened_on, amount_tiyn, note
FROM transactions
ORDER BY happened_on, id;
Таблица — множество строк одного вида. Столбец задаёт роль значения. Первичный ключ id устойчиво называет строку. Внешние ключи account_id и category_id связывают её с другими таблицами.
Разбор
Наши сущности:
accounts— места хранения денег;categories— смысл дохода или расхода и необязательный лимит;transactions— произошедшие денежные события;- месячный отчёт — вычисляемый результат, а не ещё одна копия фактов.
NULL означает «значение неизвестно или неприменимо». Лимит зарплаты равен NULL, потому что ограничивать доход расходным лимитом не нужно. Нулевой лимит означал бы другое: тратить нельзя совсем.
Сравнение = NULL никогда не даёт TRUE. Пишут IS NULL:
SELECT name
FROM categories
WHERE monthly_limit_tiyn IS NULL;
Трёхзначная логика SQL содержит TRUE, FALSE и UNKNOWN. Поэтому ограничение даты в проекте проверяет и результат date(...) IS NOT NULL: выражение bad = NULL само по себе не запрещает строку в CHECK.
Карта урока
Скажите своими словами
- Какой факт хранит строка
transactions? - Чем
NULLотличается от нуля и пустой строки? - Зачем строке устойчивый ключ?
Задание
Напишите запрос, который покажет категории без месячного лимита. Верните только name и kind.
Куда это встанет в проекте
Модель станет схемой базы. Отчёт будет вычисляться из исходных операций, поэтому обновлять две копии одного итога не придётся.
Ответы
Показать ответы
SELECT name, kind
FROM categories
WHERE monthly_limit_tiyn IS NULL;
Источники
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.