Базы данных NoSQL отличаются от реляционных баз данных тем, что они позволяют более сложные структуры, не требуя традиционных отношений, таких как «один-к-многим» или «один-к-одному». Вместо этого базы данных NoSQL используют гибкие типы, такие как массивы или поддокументы, для эффективного хранения связанных данных в одном документе. Эта гибкость позволяет разработчикам проектировать модели, которые соответствуют запросам и требованиям производительности их приложений.
Jakarta NoSQL — это Java-фреймворк, который упрощает взаимодействие с базами данных NoSQL, включая MongoDB. Он предоставляет аннотации, которые определяют, как данные сопоставляются и хранятся, позволяя разработчикам контролировать, будут ли встроенные объекты сгруппированы или хранятся в плоском виде.
При работе с MongoDB и Jakarta NoSQL одним из ключевых аспектов является то, как структурировать ваши документы. Выбор между плоской структурой и группированной структурой влияет на то, как данные хранятся, запрашиваются и извлекаются. В этой статье мы исследуем эти два подхода на практическом примере.
Jakarta NoSQL и сущность продукта
Чтобы понять плоские и группированные структуры, давайте сначала представим сущность Product
и посмотрим, как работают аннотации Jakarta NoSQL:
public class Product {
ObjectIdConverter.class) (
private String id;
private String name;
private Manufacturer manufacturer;
private List<String> tags;
private Set<Category> categories;
Product(String name, Manufacturer manufacturer, List<String> tags, Set<Category> categories) {
this.name = name;
this.manufacturer = manufacturer;
this.tags = tags;
this.categories = categories;
}
public static ProductBuilder builder() {
return new ProductBuilder();
}
}
Теперь давайте исследуем, как поле manufacturer
может храниться по-разному в зависимости от аннотаций Jakarta NoSQL.
Понимание группированных и плоских структур
Группированная структура
Группа группированной структуры организует связанную информацию в отдельные объекты в документе. Этот подход улучшает читаемость и позволяет более чисто моделировать домен. Jakarta NoSQL достигает этого с помощью @Embeddable(Embeddable.EmbeddableType.GROUPING)
.
Пример:
{
"_id": { "$oid": "67b264520abd020ec0eb9a4c" },
"categories": [
{ "name": "Computers", "description": "All computers" },
{ "name": "Electronics", "description": "All electronics" }
],
"manufacturer": {
"address": "One Infinite Loop Cupertino, CA 95014",
"name": "Apple",
"contactNumber": "+1-408-996-1010"
},
"name": "MacBook Pro",
"tags": ["smartphone", "tablet", "laptop"]
}
Здесь производитель сгруппирован в отдельный под-объект вместо того, чтобы иметь свои свойства на верхнем уровне.
Embeddable.EmbeddableType.GROUPING) (
public record Manufacturer( String name, String address, String contactNumber) {}
Плоская структура
Плоская структура сохраняет связанную информацию в одном документе, встраивая списки или вложенные поля непосредственно. Jakarta NoSQL позволяет это с помощью @Embeddable(Embeddable.EmbeddableType.FLAT)
. Этот подход полезен, когда вам нужен быстрый доступ ко всем деталям без необходимости сложных запросов.
Пример:
{
"_id": { "$oid": "67b22d20c921154b0223b27b" },
"address": "One Infinite Loop Cupertino, CA 95014",
"categories": [
{ "name": "Electronics", "description": "All electronics" },
{ "name": "Computers", "description": "All computers" }
],
"contactNumber": "+1-408-996-1010",
"name": "Apple",
"tags": ["smartphone", "tablet", "laptop"]
}
Этот подход сохраняет детали производителя напрямую в документе вместо их группировки в отдельные поля.
Embeddable.EmbeddableType.FLAT) (
public record Manufacturer( String name, String address, String contactNumber) {}
Пример использования в Jakarta NoSQL
Следующий фрагмент кода демонстрирует, как Jakarta NoSQL интегрирует эти структуры:
public class App {
public static void main(String[] args) {
var faker = new Faker();
try (SeContainer container = SeContainerInitializer.newInstance().initialize()) {
var template = container.select(DocumentTemplate.class).get();
var electronicsCategory = new Category("Electronics", "All electronics");
var computerCategory = new Category("Computers", "All computers");
var tags = List.of("smartphone", "tablet", "laptop");
var manufacturer = new Manufacturer("Apple", "One Infinite Loop Cupertino, CA 95014", "+1-408-996-1010");
Product macBookPro = Product.builder().categories(Set.of(electronicsCategory, computerCategory))
.manufacturer(manufacturer)
.name("MacBook Pro")
.tags(tags)
.build();
Product product = template.insert(macBookPro);
System.out.println("Product saved: " + product);
}
}
}
Выбор правильного подхода
- Используйте плоскую структуру, когда вам нужен более простой макет документа с всеми свойствами на одном уровне.
- Используйте группированную структуру, когда организуете связанные данные в логические под-объекты для улучшения читаемости и удобства поддержки.
Заключение
Jakarta NoSQL предлагает гибкость в структурировании документов MongoDB с использованием @Embeddable(Embeddable.EmbeddableType)
. Выбор плоской или групповой структуры зависит от ваших паттернов доступа к данным и предпочтений в моделировании. Понимание этих подходов позволяет эффективно проектировать базы данных, делая запросы более эффективными, сохраняя при этом вашу доменную модель чистой и хорошо структурированной.
Для полного кода посетите репозиторий GitHub.
Видео
Source:
https://dzone.com/articles/handling-embedded-data-in-nosql-with-java