Что такое InMemory Database?

«Что такое InMemory Database?» — вопрос из категории Базы данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

InMemory Database (База данных в памяти) — это СУБД, которая хранит все данные исключительно в оперативной памяти (RAM) процесса приложения, не используя постоянное хранилище (диск). Это временная, высокопроизводительная БД, которая обнуляется при остановке приложения.

Основные сценарии использования:

  1. Модульное и интеграционное тестирование:

    // Пример с Entity Framework Core
    [Test]
    public void Service_Adds_User_To_Database()
    {
        // 1. Создаем уникальное имя БД для изоляции теста
        var options = new DbContextOptionsBuilder<AppDbContext>()
            .UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
            .Options;
    
        // 2. Используем контекст с InMemory
        using (var context = new AppDbContext(options))
        {
            var service = new UserService(context);
            service.CreateUser("John Doe");
    
            // 3. Проверяем результат в памяти
            Assert.That(context.Users.Count(), Is.EqualTo(1));
            Assert.That(context.Users.First().Name, Is.EqualTo("John Doe"));
        }
        // 4. После using БД автоматически уничтожается
    }

    Преимущество: Тесты становятся быстрыми, изолированными и не требуют развертывания реальной СУБД.

  2. Кэширование и временные данные: Для хранения сессий, результатов сложных вычислений или данных, актуальных только во время работы приложения.

Важные ограничения (почему не для продакшена):

  • Волатильность: Все данные теряются при перезапуске процесса.
  • Ограниченный объем: Размер БД ограничен доступной оперативной памятью.
  • Неполная эмуляция: InMemory-провайдеры (как в EF Core) часто не поддерживают все функции реальных СУБД (сложные транзакции, ограничения внешних ключей, специфичные типы данных). Это может маскировать ошибки, которые проявятся только на реальной базе.