Работа с базами данных в C#: PostgreSQL и MongoDB

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: зачем C# разработчику знать PostgreSQL и MongoDB?

Современная разработка на C# (.NET) редко обходится без работы с базами данных. Выбор между реляционной (SQL) и документо-ориентированной (NoSQL) СУБД зависит от архитектуры проекта. PostgreSQL — мощная реляционная база с поддержкой JSON, а MongoDB — гибкая документная база для быстрых прототипов и Big Data. В этой статье мы разберём подключение и базовые операции с обеими системами из C#.

1. Работа с PostgreSQL в C#

Для взаимодействия с PostgreSQL в .NET используется провайдер Npgsql. Он поддерживает Entity Framework Core и прямое выполнение SQL-запросов.

1.1. Установка и подключение

Установите NuGet-пакет:

dotnet add package Npgsql

Пример строки подключения:

Host=localhost;Port=5432;Database=mydb;Username=user;Password=pass

1.2. CRUD-операции через Npgsql

Создадим таблицу Users и выполним базовые операции:

using Npgsql;

var connString = "Host=localhost;Database=testdb;Username=postgres;Password=123";
await using var conn = new NpgsqlConnection(connString);
await conn.OpenAsync();

// Создание таблицы
var createCmd = new NpgsqlCommand(@"
    CREATE TABLE IF NOT EXISTS Users (
        Id SERIAL PRIMARY KEY,
        Name VARCHAR(100),
        Age INT
    )", conn);
await createCmd.ExecuteNonQueryAsync();

// Вставка данных
var insertCmd = new NpgsqlCommand(
    "INSERT INTO Users (Name, Age) VALUES (@n, @a)", conn);
insertCmd.Parameters.AddWithValue("n", "Алексей");
insertCmd.Parameters.AddWithValue("a", 30);
await insertCmd.ExecuteNonQueryAsync();

// Чтение данных
var readCmd = new NpgsqlCommand("SELECT * FROM Users", conn);
var reader = await readCmd.ExecuteReaderAsync();
while (await reader.ReadAsync())
{
    Console.WriteLine($"{reader["Id"]}: {reader["Name"]}, {reader["Age"]} лет");
}

1.3. Использование Entity Framework Core

Установите пакет:

dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL

Определите модель и контекст:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

public class AppDbContext : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseNpgsql("Host=localhost;Database=testdb;Username=postgres;Password=123");
}

CRUD через EF Core:

using var db = new AppDbContext();

// Добавление
db.Users.Add(new User { Name = "Мария", Age = 25 });
await db.SaveChangesAsync();

// Чтение
var users = await db.Users.ToListAsync();
foreach (var u in users)
    Console.WriteLine($"{u.Name} - {u.Age}");

// Обновление
var user = await db.Users.FirstAsync(u => u.Name == "Мария");
user.Age = 26;
await db.SaveChangesAsync();

// Удаление
db.Users.Remove(user);
await db.SaveChangesAsync();

2. Работа с MongoDB в C#

MongoDB хранит данные в формате BSON (бинарный JSON). Для C# используется драйвер MongoDB.Driver.

2.1. Установка и подключение

Установите NuGet-пакет:

dotnet add package MongoDB.Driver

Подключение к локальному серверу:

var client = new MongoClient("mongodb://localhost:27017");
var database = client.GetDatabase("testdb");
var collection = database.GetCollection<BsonDocument>("users");

2.2. CRUD-операции

Работа с документами через BsonDocument:

// Создание документа
var doc = new BsonDocument
{
    { "name", "Иван" },
    { "age", 28 },
    { "skills", new BsonArray { "C#", "MongoDB", "Docker" } }
};
await collection.InsertOneAsync(doc);

// Чтение всех документов
var allDocs = await collection.Find(new BsonDocument()).ToListAsync();
foreach (var d in allDocs)
    Console.WriteLine(d.ToJson());

// Поиск по условию
var filter = Builders<BsonDocument>.Filter.Eq("name", "Иван");
var found = await collection.Find(filter).FirstOrDefaultAsync();

// Обновление
var update = Builders<BsonDocument>.Update.Set("age", 29);
await collection.UpdateOneAsync(filter, update);

// Удаление
await collection.DeleteOneAsync(filter);

2.3. Работа с типизированными классами

Определите C#-класс, соответствующий документу:

public class User
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public List<string> Skills { get; set; }
}

// Подключение
var collection = database.GetCollection<User>("users");

// Вставка
var user = new User { Name = "Ольга", Age = 32, Skills = new() { "Python", "C#" } };
await collection.InsertOneAsync(user);

// LINQ-запросы
var result = await collection.AsQueryable()
    .Where(u => u.Age > 25 && u.Skills.Contains("C#"))
    .ToListAsync();

3. Сравнение PostgreSQL и MongoDB: когда что выбирать?

Выбор между реляционной и документной БД — не религиозный вопрос, а архитектурное решение. Рассмотрим ключевые критерии.

3.1. Структура данных

  • PostgreSQL — строгая схема, поддержка внешних ключей, транзакций ACID. Идеален для финансовых систем, ERP, CRM.
  • MongoDB — гибкая схема, вложенные документы. Подходит для каталогов товаров, логов, IoT-данных, прототипов.

3.2. Производительность

  • PostgreSQL — быстрые JOIN-запросы, сложные агрегации, но медленнее на операциях с большими JSON-блоками.
  • MongoDB — высокая скорость записи, встроенное шардирование, но слабая поддержка транзакций (с версии 4.0 появились многодокументные транзакции).

3.3.

Блоги

Рекомендаций по книгам