Введение: зачем 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 появились многодокументные транзакции).