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

Какие знаешь виды нереляционных БД?

2.3 Middle🔥 151 комментариев
#Кэширование и NoSQL

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

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

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

NoSQL базы данных

Определение и назначение

NoSQL (Not Only SQL) — это класс баз данных, которые отличаются от традиционных реляционных БД отсутствием фиксированной схемы и использованием различных моделей данных. Они масштабируются горизонтально и оптимизированы для специфических типов данных.

1. Документоориентированные БД

Хранят данные в виде документов (обычно JSON или BSON).

MongoDB

// Подключение
MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
MongoDatabase database = mongoClient.getDatabase("myapp");
MongoCollection<Document> collection = database.getCollection("users");

// Вставка документа
Document user = new Document()
    .append("name", "John")
    .append("age", 30)
    .append("email", "john@example.com")
    .append("skills", Arrays.asList("Java", "MongoDB", "Spring"));
collection.insertOne(user);

// Поиск документов
Document foundUser = collection.find(new Document("name", "John")).first();

// Обновление
collection.updateOne(
    new Document("name", "John"),
    new Document("$set", new Document("age", 31))
);

// Удаление
collection.deleteOne(new Document("name", "John"));

Особенности:

  • Гибкая схема (Schema-less)
  • Простое хранение иерархических данных
  • Поддержка запросов по вложенным полям
  • Горизонтальная масштабируемость через sharding

CouchDB

// CouchDB использует HTTP API
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("http://localhost:5984/mydb"))
    .GET()
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

Особенности:

  • Distribuированная репликация
  • REST API
  • Встроенный full-text search
  • Оффлайн-первый дизайн

2. Системы типа ключ-значение

Хранят простые пары ключ-значение для максимальной скорости.

Redis

// Подключение через Jedis
Jedis jedis = new Jedis("localhost", 6379);

// Простые строковые значения
jedis.set("username", "john");
String username = jedis.get("username");

// Сложные структуры
jedis.hset("user:1", "name", "John");
jedis.hset("user:1", "age", "30");
Map<String, String> user = jedis.hgetAll("user:1");

// Списки
jedis.rpush("tasks", "task1", "task2", "task3");
List<String> tasks = jedis.lrange("tasks", 0, -1);

// Множества
jedis.sadd("tags", "java", "spring", "database");
Set<String> tags = jedis.smembers("tags");

// С истечением времени (TTL)
jedis.setex("session:123", 3600, "sessionData");

// Кэширование результатов
String cachedResult = jedis.get("query:result");
if (cachedResult == null) {
    cachedResult = expensiveQuery();
    jedis.setex("query:result", 3600, cachedResult);
}

Особенности:

  • Очень быстрый доступ (в памяти)
  • Поддерживает различные структуры данных
  • Идеален для кэширования
  • Pub/Sub для обмена сообщениями

Memcached

// Простой кэш, похож на Redis
MemcachedClient client = new MemcachedClient();
client.set("key", 3600, "value");
String value = (String) client.get("key");

3. Поисковые системы

Оптимизированы для полнотекстового поиска.

Elasticsearch

// Spring Data Elasticsearch
@Document(indexName = "articles")
public class Article {
    @Id
    private String id;
    
    @Field(type = FieldType.Text, analyzer = "standard")
    private String title;
    
    @Field(type = FieldType.Text)
    private String content;
}

// Репозиторий
public interface ArticleRepository extends ElasticsearchRepository<Article, String> {
    List<Article> findByTitleContains(String title);
}

// Использование
@Service
public class SearchService {
    @Autowired
    private ArticleRepository articleRepository;
    
    public List<Article> search(String query) {
        return articleRepository.findByTitleContains(query);
    }
}

Особенности:

  • Быстрый полнотекстовый поиск
  • Анализ текста и морфология
  • Аналитика в реальном времени
  • Очень масштабируема

4. Графовые БД

Хранят данные в виде графов (узлы, рёбра).

Neo4j

// Spring Data Neo4j
@Node
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    
    private String name;
    
    @Relationship(type = "KNOWS")
    private Set<Person> knows;
}

// Запросы через Cypher
public interface PersonRepository extends Neo4jRepository<Person, Long> {
    @Query("MATCH (p:Person)-[:KNOWS]-(other) WHERE p.name = $name RETURN other")
    List<Person> findFriends(@Param("name") String name);
}

// Использование
List<Person> friends = personRepository.findFriends("John");

Особенности:

  • Оптимален для социальных сетей
  • Быстрые обходы графа
  • ACID гарантии
  • Пример: LinkedIn, Facebook

5. Колончатые хранилища

Хранят данные по колонкам вместо строк, хороши для аналитики.

Apache Cassandra

// DataStax Driver
Cluster cluster = Cluster.builder()
    .addContactPoint("localhost")
    .build();
Session session = cluster.connect();

// Вставка данных
session.execute("INSERT INTO users (id, name, age) VALUES (1, John, 30)");

// Выборка
ResultSet results = session.execute("SELECT * FROM users WHERE id = 1");
for (Row row : results) {
    System.out.println(row.getString("name"));
}

Особенности:

  • Распределённая архитектура
  • Высокая доступность
  • Масштабируется горизонтально
  • Write-heavy приложения

6. Временные ряды БД

Оптимизированы для хранения метрик во времени.

InfluxDB / Prometheus

// Запись метрик в Prometheus
Counter requestCounter = Counter.build()
    .name("requests_total")
    .help("Total requests")
    .register();

requestCounter.inc();

// Гистограмма для отслеживания времени отклика
Histogram responseTime = Histogram.build()
    .name("response_time_seconds")
    .help("Response time")
    .register();

long start = System.currentTimeMillis();
// ... выполнение операции
responseTime.observe((System.currentTimeMillis() - start) / 1000.0);

Особенности:

  • Оптимизированы для временных рядов
  • Сжатие данных
  • Быстрые агрегации
  • Мониторинг и метрики

Сравнительная таблица

БДТипМасштабируемостьКонсистентностьПример
MongoDBDocumentГоризонтальнаяEventualКаталоги продуктов
RedisKey-ValueВертикальнаяStrongКэширование, сессии
ElasticsearchSearchГоризонтальнаяEventualПоиск в контенте
Neo4jGraphВертикальнаяStrongСоциальные сети
CassandraColumnarГоризонтальнаяEventualВременные ряды, логи

Выбор БД для Java проекта

  • Кэш быстро меняющихся данных → Redis
  • Гибкие структуры данных → MongoDB
  • Поиск текста → Elasticsearch
  • Связи между данными → Neo4j
  • Высоконагруженные пишущие нагрузки → Cassandra
  • Метрики и логи → InfluxDB / Prometheus