Что такое документные базы данных?
Что проверяют
Понимаете ли вы, за что платите, отказываясь от жёсткой схемы, и как это уживается со статической типизацией Go. Вопрос почти всегда ведёт к выбору хранилища: сможете ли объяснить, почему под эту задачу документы, а не таблицы.
Как отвечать
Документная база хранит записи как самодостаточные документы в формате, близком к JSON, с вложенностью и массивами. Схема заранее не задаётся, поля документов одной коллекции могут отличаться. Единица атомарности это документ, поэтому данные, которые читаются вместе, кладут вместе, а нормализация уходит на второй план.
Сильный ответ сразу снимает два устаревших тезиса: индексы по любым полям и вложенным путям есть, а транзакции по нескольким документам в зрелых системах поддерживаются, просто дороже и остаются редким инструментом.
Для Go важна стыковка с типами: документ раскладывается в структуру через теги, и тут появляются свои грабли.
type Order struct {
ID primitive.ObjectID `bson:"_id,omitempty"`
UserID string `bson:"user_id"`
Note *string `bson:"note,omitempty"`
}Указатель отличает отсутствующее поле от пустого значения, omitempty не даёт затереть поле нулём при частичном обновлении, а запрос всегда идёт с контекстом и таймаутом. Отсутствие документа драйвер отдаёт отдельной ошибкой, проверять её надо явно.
Где спотыкаются
Считают отсутствие схемы бесплатным. Схема никуда не делась, она переехала в код: в коллекции копятся документы разных поколений, и сервис обязан читать их все. Лечится версией внутри документа, проверкой схемы на стороне базы и миграцией при записи.
Проектируют как в реляционной базе: коллекции вместо таблиц и ссылки между ними. Тогда каждое чтение превращается в несколько запросов, а полноценных соединений тут нет. Модель строят от запросов приложения, а дублирование данных здесь норма.
Не видят альтернативы под рукой. Если гибкой должна быть лишь часть данных внутри в целом табличной модели, колонка JSON в реляционной базе с индексом по пути закрывает задачу и оставляет вам транзакции и соединения. Ответ, что документную взяли, потому что она быстрее, без уточнения, что именно быстрее, звучит слабо.