Чем база данных отличается от обычного файла и какие гарантии обеспечивает
Что проверяют
Понимаете ли вы, что даёт база данных помимо места для данных, и не броситесь ли писать собственное хранилище на файлах. В Go-командах вопрос задают чаще, чем в других: язык располагает к тому, чтобы сложить структуру в файл и считать задачу решённой.
Как отвечать
Начните с честного: база данных тоже лежит в файлах, разница в гарантиях поверх них.
Файл даёт последовательность байт и права файловой системы, и на этом всё. Успешный Write означает лишь, что данные в страничном кэше ядра: до Sync они пропадают при потере питания. Обновление из нескольких шагов не атомарно, и падение посередине оставляет полуфайл. Параллельная запись из двух процессов не разруливается никак, блокировки вы делаете сами. Поиск это полный перебор, схемы нет, совместимость формата ваша забота.
База данных добавляет поверх этого:
- транзакции, то есть атомарность группы изменений и откат целиком;
- долговечность через журнал и
fsyncна коммите; - изоляцию параллельных транзакций через версии строк или блокировки, с настраиваемыми уровнями;
- ограничения целостности: внешние ключи,
UNIQUE,CHECK; - индексы и планировщик, то есть предсказуемую скорость выборки;
- одновременный доступ многих клиентов, права, репликацию и восстановление на момент времени.
Хорошо назвать и середину: атомарная подмена файла через временный плюс rename в той же файловой системе, встраиваемые движки для локального состояния.
Где спотыкаются
Перечисляют буквы аббревиатуры ACID и не могут объяснить изоляцию на примере. Простой случай: две транзакции читают остаток и списывают из него, без изоляции обе видят старое значение и остаток уходит в минус.
Считают, что после записи в файл данные уже на диске. Гарантию даёт только явная синхронизация, и именно она самая дорогая часть коммита в любой базе, поэтому пакетная вставка в одной транзакции быстрее тысячи отдельных.
Сводят разницу к структурированности и скорости. Скорость файла на простом чтении может быть выше, а главное отличие в поведении при сбое и при конкурентном доступе.