> Что такое документные базы данных? (Go)

Уровень: junior · Роль: backend · Категория: Технические вопросы

Компании: Axel Pro

Стек: Go

> Пример ответа

Короткий ответ

Документная база данных - это тип NoSQL-хранилища, где данные хранятся в виде документов (обычно JSON, BSON или XML). Каждый документ - самостоятельная единица, содержащая пары "ключ-значение", и не требует заранее заданной схемы. Это позволяет гибко менять структуру данных без миграций. Примеры: MongoDB, CouchDB, Firestore. В Go часто используются драйверы вроде mongo-driver для работы с такими БД.

Подробное объяснение

Документные БД относятся к категории NoSQL и ориентированы на хранение полуструктурированных данных. Основная единица - документ, который может иметь вложенные объекты, массивы и разные поля у разных документов одной коллекции. В отличие от реляционных БД, здесь нет таблиц, строк и жёсткой схемы - вместо этого коллекции документов.

Ключевые особенности:

  • Гибкая схема: поля можно добавлять или удалять без ALTER TABLE.
  • Иерархичность: данные естественно отражают вложенную структуру (например, заказ с позициями).
  • Масштабируемость: горизонтальное масштабирование через шардирование по ключу документа.
  • Индексация: поддерживаются индексы по полям документов, включая составные и текстовые.

Trade-off: отсутствие JOIN-ов - связи между документами обычно реализуются через вложенность или ссылки (manual references), что требует дополнительных запросов или denormalization.

На практике

Для backend-разработчика на Go документные БД - это типичный выбор для сервисов с быстро меняющейся моделью данных, каталогов, пользовательских профилей, логов. В Go работа обычно идёт через официальные драйверы:

  • MongoDB: go.mongodb.org/mongo-driver
  • CouchDB: github.com/go-kivik/kivik
  • Firestore: cloud.google.com/go/firestore

Основные операции: подключение к кластеру, CRUD через коллекции, построение фильтров, работа с агрегациями (pipeline). Важно помнить про контексты (context.Context) для таймаутов и отмены операций.

Пример кода

Пример работы с MongoDB на Go:

GO
package main
import (
"context"
"fmt"
"log"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
type User struct {
Name string `bson:"name"`
Email string `bson:"email"`
Tags []string `bson:"tags,omitempty"`
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
log.Fatal(err)
}
defer client.Disconnect(ctx)
coll := client.Database("app").Collection("users")
// вставка документа
user := User{Name: "Alice", Email: "alice@example.com", Tags: []string{"admin"}}
res, err := coll.InsertOne(ctx, user)
if err != nil {
log.Fatal(err)
}
fmt.Println("inserted id:", res.InsertedID)
// поиск по полю
var found User
err = coll.FindOne(ctx, bson.M{"email": "alice@example.com"}).Decode(&found)
if err != nil {
log.Fatal(err)
}
fmt.Printf("found: %+v\n", found)
}

Как отвечать на собеседовании

Начните с определения: документная БД хранит данные в виде JSON-подобных документов без жёсткой схемы. Затем кратко перечислите преимущества: гибкость, скорость разработки, естественное представление вложенных данных. Упомяните ограничения: отсутствие JOIN, сложность транзакций (в MongoDB они есть, но ограничены), возможная избыточность данных. Если спросят про Go - расскажите про драйвер mongo-driver, работу с bson-тегами и контекстами. Держите ответ структурированным: определение → пример → trade-off.

Что проверяет интервьюер

Интервьюер оценивает:

  • понимание разницы между SQL и NoSQL, конкретно документными БД;
  • знание сильных и слабых сторон (когда выбирать документную БД, а когда реляционную);
  • практический опыт: умение описать CRUD-операции, индексы, агрегации;
  • для Go-позиции - знание типичных паттернов работы с драйвером и обработки ошибок.

Типичные ошибки

  • Путаница с key-value хранилищами: в документных БД есть структура и вложенность, а не просто "ключ → значение".
  • Утверждение, что документные БД не поддерживают транзакции - в MongoDB транзакции есть (с версии 4.0), но с ограничениями.
  • Игнорирование индексов: без них запросы по неключевым полям будут сканировать всю коллекцию.
  • Непонимание denormalization: попытка строить связи как в SQL (через внешние ключи) приводит к лишним запросам.
  • В Go - забывание про context и defer client.Disconnect(), что вызывает утечки соединений.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью