Ответ
Нереляционные (NoSQL) базы данных — это системы управления базами данных, которые хранят и управляют данными в форматах, отличных от таблиц со строками и столбцами, используемых в реляционных (SQL) базах данных.
Ключевые отличия от реляционных (SQL) БД:
Характеристика | NoSQL (Нереляционные) | SQL (Реляционные) |
---|---|---|
Модель данных | Гибкая (документы, ключ-значение, графы, колонки) | Жесткая, предопределенная схема (таблицы) |
Масштабируемость | Горизонтальная (добавление новых серверов) | Вертикальная (увеличение мощности одного сервера) |
Согласованность | Часто жертвуют строгой согласованностью ради доступности (BASE, теорема CAP) | Строгая согласованность (ACID) |
Схема | Динамическая, "схема при чтении" (schema-on-read) | Фиксированная, "схема при записи" (schema-on-write) |
Язык запросов | Различается для каждой БД (MQL, CQL и т.д.) | Стандартизированный язык SQL |
Основные типы NoSQL БД и их применение:
Документо-ориентированные (Document Stores)
- Примеры: MongoDB, Couchbase.
- Описание: Хранят данные в виде документов, похожих на JSON. Каждый документ может иметь свою уникальную структуру.
- Применение: Веб-приложения, каталоги товаров, пользовательские профили.
Ключ-значение (Key-Value Stores)
- Примеры: Redis, DynamoDB.
- Описание: Простейшая модель, где данные хранятся в виде пар "ключ-значение". Очень высокая производительность на чтение и запись.
- Применение: Кэширование, хранение сессий, игровые таблицы лидеров.
Колоночные (Column-Family Stores)
- Примеры: Cassandra, HBase.
- Описание: Данные хранятся в колонках, а не в строках. Оптимизированы для быстрой агрегации и аналитики по большим объемам данных.
- Применение: Big Data, аналитические системы, системы логирования.
Графовые (Graph Databases)
- Примеры: Neo4j, Amazon Neptune.
- Описание: Специализированы на хранении данных в виде графа (узлы и ребра), что позволяет эффективно выполнять запросы по связям.
- Применение: Социальные сети, рекомендательные системы, системы обнаружения мошенничества.
Пример работы с MongoDB в Go:
// Определение структуры для хранения в MongoDB
type User struct {
ID primitive.ObjectID `bson:"_id,omitempty"`
Name string `bson:"name"`
Email string `bson:"email"`
}
// Подключение и вставка документа
func main() {
client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
log.Fatal(err)
}
collection := client.Database("mydatabase").Collection("users")
newUser := User{Name: "Alice", Email: "alice@example.com"}
result, err := collection.InsertOne(context.TODO(), newUser)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Документ вставлен с ID: %vn", result.InsertedID)
}