← Назад к вопросам

Какие знаешь типы баз данных?

1.3 Junior🔥 191 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI21 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Типы баз данных

Существует множество типов баз данных, каждый с определёнными характеристиками и случаями использования. Рассмотрю основные и самые популярные.

1. Реляционные базы данных (RDBMS)

Самый классический и распространённый тип. Данные организованы в таблицы с определённой схемой.

SQL Server

// Подключение
var connectionString = "Server=localhost;Database=MyDb;Trusted_Connection=true;";
using var connection = new SqlConnection(connectionString);
await connection.OpenAsync();

// LINQ to EF Core
var users = await dbContext.Users
    .Where(u => u.Age > 18)
    .OrderBy(u => u.Name)
    .ToListAsync();

Характеристики:

  • ACID транзакции
  • Сложные JOIN запросы
  • Встроенные функции (T-SQL)
  • Отличная производительность
  • Windows-focused, но есть Linux версия

Когда использовать:

  • Финансовые системы
  • CRM, ERP
  • Системы с сложными отношениями

PostgreSQL

// Подключение
var connectionString = "Host=localhost;Username=admin;Password=pass;Database=mydb;";
var dataSourceBuilder = new NpgsqlDataSourceBuilder(connectionString);
var dataSource = dataSourceBuilder.Build();

// EF Core
var users = await dbContext.Users
    .Where(u => u.CreatedAt > DateTime.Now.AddDays(-7))
    .ToListAsync();

Характеристики:

  • Открытый исходный код
  • ACID транзакции
  • JSON поддержка
  • Отличные функции (JSONB, массивы, range типы)
  • Cross-platform
  • JSON операторы: ->, ->>, @>, <@

Когда использовать:

  • Opensource проекты
  • Гибкие структуры с JSON
  • Масштабируемые приложения

MySQL / MariaDB

// Подключение через EF Core
var connectionString = "Server=localhost;Database=mydb;Uid=root;Pwd=password;";
optionsBuilder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString));

var users = await dbContext.Users.ToListAsync();

Характеристики:

  • Популярна в веб-разработке
  • Простая в настройке
  • Хорошая производительность
  • ACID поддержка (в InnoDB)

Oracle Database

// Для Oracle нужен специальный драйвер
var connectionString = "Data Source=Oracle;User Id=admin;Password=pass;";
using var connection = new OracleConnection(connectionString);

Характеристики:

  • Корпоративный стандарт
  • Мощные функции
  • Сложная лицензия
  • Высокая стоимость

2. NoSQL - Документно-ориентированные БД

MongoDB

// Подключение
var client = new MongoClient("mongodb://localhost:27017");
var database = client.GetDatabase("mydb");
var usersCollection = database.GetCollection<User>("users");

// Вставка
await usersCollection.InsertOneAsync(new User { Id = ObjectId.GenerateNewId(), Name = "John", Age = 30 });

// Поиск
var users = await usersCollection
    .Find(u => u.Age > 25)
    .ToListAsync();

// Обновление
var update = Builders<User>.Update
    .Set(u => u.Age, 31)
    .Set(u => u.UpdatedAt, DateTime.UtcNow);

await usersCollection.UpdateOneAsync(u => u.Id == userId, update);

// Удаление
await usersCollection.DeleteOneAsync(u => u.Id == userId);

Характеристики:

  • Документы в формате JSON/BSON
  • Без схемы (schema-less)
  • Горизонтальное масштабирование
  • Репликация и шардирование
  • Транзакции (с версии 4.0)

Когда использовать:

  • Содержимое с переменной структурой
  • Высокая нагрузка на запись
  • Кэширование
  • Content Management Systems

Firestore / Firebase

// Через Firebase Admin SDK
var db = FirebaseAdmin.Database.FirebaseDatabase.DefaultInstance;
var reference = db.GetReference("users").Child(userId);
await reference.SetValueAsync(new User { Name = "John", Age = 30 });

Характеристики:

  • Cloud-based
  • Real-time обновления
  • Встроенная безопасность
  • Автоматическое индексирование

3. Key-Value хранилища

Redis

using StackExchange.Redis;

var connection = ConnectionMultiplexer.Connect("localhost:6379");
var db = connection.GetDatabase();

// Строки
await db.StringSetAsync("user:1:name", "John");
var name = await db.StringGetAsync("user:1:name");

// Хэши (хороши для объектов)
await db.HashSetAsync("user:1", new HashEntry[]
{
    new HashEntry("name", "John"),
    new HashEntry("age", 30),
    new HashEntry("email", "john@example.com")
});

var userHash = await db.HashGetAllAsync("user:1");

// Списки
await db.ListPushAsync("messages", "Hello");
await db.ListPushAsync("messages", "World");
var messages = await db.ListRangeAsync("messages", 0, -1);

// Множества (Set)
await db.SetAddAsync("tags", "csharp");
await db.SetAddAsync("tags", "dotnet");
var tags = await db.SetMembersAsync("tags");

// Сортированные множества (Sorted Set)
await db.SortedSetAddAsync("leaderboard", "player1", 100);
await db.SortedSetAddAsync("leaderboard", "player2", 200);

// Expiration (TTL)
await db.StringSetAsync("temp_code", "123456", TimeSpan.FromMinutes(5));

Характеристики:

  • In-memory хранилище
  • Экстремально быстро
  • Разные структуры данных
  • Expiration / TTL
  • Pub/Sub
  • Сессии и кэширование

Когда использовать:

  • Кэширование
  • Сессии пользователей
  • Счётчики и рейтинги
  • Real-time аналитика

Memcached

// Через EnyimMemcached
var cache = new MemcachedClient();
cache.Store(StoreMode.Set, "user:1", new User { Id = 1, Name = "John" });
var user = cache.Get<User>("user:1");

Характеристики:

  • In-memory кэш
  • Простой интерфейс
  • Распределённое кэширование
  • Нет персистентности

4. Временные ряды (Time Series)

InfluxDB

// Запись метрик
var point = PointData
    .Measurement("cpu_load")
    .Tag("host", "server-01")
    .Field("value", 0.64)
    .Timestamp(DateTime.UtcNow, WritePrecision.Ns);

await _writeApiAsync.WritePointAsync(point, "mydb");

// Чтение
var flux = "from(bucket:\"mydb\") |> range(start: -1h)";
var result = await _queryApi.QueryAsync(flux);

Характеристики:

  • Оптимизирована для временных рядов
  • Метрики с временными метками
  • Высокая сжимаемость
  • Retention policies

Когда использовать:

  • Мониторинг и метрики
  • Логирование
  • IoT данные
  • Аналитика производительности

Prometheus

# Prometheus scraps metrics from endpoints
GET /metrics

http_requests_total{method="POST",code="200"} 1027
http_requests_total{method="GET",code="404"} 3

5. Поисковые двигатели

Elasticsearch

using Elasticsearch.Net;

var client = new ElasticClient(new ConnectionSettings(new Uri("http://localhost:9200")));

// Индексирование документа
var document = new Product { Id = 1, Name = "Laptop", Price = 999.99 };
var response = await client.IndexAsync(document, i => i
    .Index("products")
    .Id("1")
);

// Поиск
var searchResponse = await client.SearchAsync<Product>(s => s
    .Index("products")
    .Query(q => q
        .Match(m => m
            .Field(f => f.Name)
            .Query("laptop")
        )
    )
);

var results = searchResponse.Documents;

Характеристики:

  • Полнотекстовый поиск
  • Анализ текста
  • Масштабируемость
  • Встроенная аналитика
  • Поддержка сложных запросов

Когда использовать:

  • Полнотекстовый поиск
  • Логирование (ELK stack)
  • Аналитика
  • E-commerce поиск

6. Графовые базы данных

Neo4j

using Neo4j.Driver;

var driver = GraphDatabase.Driver("bolt://localhost:7687", 
    AuthTokens.Basic("neo4j", "password"));

var session = driver.AsyncSession();

// Создание узлов и связей
await session.ExecuteWriteAsync(async tx =>
{
    var result = await tx.RunAsync(
        "CREATE (a:Person {name: 'John'}) "
        + "CREATE (b:Person {name: 'Jane'}) "
        + "CREATE (a)-[:KNOWS]->(b) "
        + "RETURN a, b"
    );
    return result;
});

// Поиск связей
await session.ExecuteReadAsync(async tx =>
{
    var result = await tx.RunAsync(
        "MATCH (a:Person)-[:KNOWS]-(b:Person) "
        + "WHERE a.name = 'John' "
        + "RETURN b.name"
    );
    return result;
});

Характеристики:

  • Узлы и рёбра
  • Граф запросы
  • Отличная производительность для связанных данных
  • Cypher язык запросов

Когда использовать:

  • Социальные сети
  • Рекомендационные системы
  • Системы управления контактами
  • Анализ связей

7. Columnar (OLAP) базы данных

ClickHouse

INSERT INTO analytics (timestamp, event, user_id, value) 
VALUES ('2024-01-01 10:00:00', 'click', 1, 100);

SELECT event, count(*) as cnt 
FROM analytics 
GROUP BY event;

Характеристики:

  • Сжатие по столбцам
  • Высокая скорость аналитических запросов
  • Массовая вставка данных

Когда использовать:

  • Big Data аналитика
  • OLAP системы
  • Большие объёмы исторических данных

8. Новые типы

Cassandra - Wide Column

CREATE TABLE users (
  user_id UUID PRIMARY KEY,
  name TEXT,
  email TEXT,
  created_at TIMESTAMP
);

DynamoDB - Managed NoSQL

var client = new AmazonDynamoDBClient();
var request = new GetItemRequest
{
    TableName = "Users",
    Key = new Dictionary<string, AttributeValue>
    {
        { "UserId", new AttributeValue { S = "123" } }
    }
};
var response = await client.GetItemAsync(request);

Elasticsearch - Search

RabbitMQ - Message Queue

Apache Kafka - Event Streaming

Сравнение типов баз данных

ТипМасштабируемостьСкоростьСогласованностьГибкостьПримеры
RDBMSВертикальнаяСредняяВысокая (ACID)Низкая (схема)SQL Server, PostgreSQL
DocumentГоризонтальнаяСредняяСлабаяВысокаяMongoDB
Key-ValueГоризонтальнаяОчень высокаяСлабаяНизкаяRedis
SearchГоризонтальнаяОчень высокаяСлабаяСредняяElasticsearch
GraphВертикальнаяВысокаяВысокаяСредняяNeo4j
Time SeriesГоризонтальнаяОчень высокаяСлабаяНизкаяInfluxDB

Как выбирать базу данных?

  1. Структура данных - структурированные (RDBMS) vs неструктурированные (NoSQL)
  2. Масштабируемость - нужна ли горизонтальная масштабируемость
  3. Консистентность - ACID требуется или BASE допустимо
  4. Скорость - нужна ли in-memory скорость
  5. Функциональность - поиск, графы, временные ряды
  6. Экосистема - поддержка в .NET, драйверы
  7. Стоимость - открытый код vs коммерческие

Заключение

В современном приложении часто используется полиархитектура - несколько баз данных одновременно:

SQL Server      - основные данные (OLTP)
      ↓
Redis          - кэширование
Elasticsearch  - поиск
InfluxDB       - метрики
MongoDB        - логи
Neo4j          - соцсеть
Kafka          - события

Каждая БД для своей задачи - это правильный подход.

Какие знаешь типы баз данных? | PrepBro