Les bases de données NoSQL se distinguent des bases de données relationnelles en permettant des structures plus complexes sans nécessiter de relations traditionnelles telles que un-à-plusieurs ou un-à-un. Au lieu de cela, les bases de données NoSQL exploitent des types flexibles, tels que des tableaux ou des sous-documents, pour stocker efficacement des données connexes au sein d’un seul document. Cette flexibilité permet aux développeurs de concevoir des modèles adaptés aux besoins de requête et de performance de leur application.
Jakarta NoSQL est un framework Java qui simplifie les interactions avec les bases de données NoSQL, y compris MongoDB. Il fournit des annotations qui déterminent comment les données sont mappées et stockées, permettant aux développeurs de contrôler si les objets intégrés sont regroupés ou stockés de manière plate.
Lorsque vous travaillez avec MongoDB et Jakarta NoSQL, l’une des considérations clés est la manière de structurer vos documents. Choisir entre une structure plate et une structure regroupée impacte la façon dont les données sont stockées, interrogées et récupérées. Dans cet article, nous explorons ces deux approches à l’aide d’un exemple pratique.
Jakarta NoSQL et Entité Produit
Pour comprendre les structures plates et regroupées, commençons par présenter l’entité Produit
et voir comment les annotations Jakarta NoSQL fonctionnent :
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();
}
}
Maintenant, explorons comment le champ fabricant
peut être stocké différemment en fonction des annotations Jakarta NoSQL.
Compréhension des Structures Regroupées et Plates
Structure Regroupée
Une structure groupée organise les informations connexes en objets distincts au sein du document. Cette approche améliore la lisibilité et permet une pratique de modélisation de domaine plus propre. Jakarta NoSQL réalise cela en utilisant @Embeddable(Embeddable.EmbeddableType.GROUPING)
.
Exemple :
{
"_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"]
}
Ici, le fabricant est regroupé dans un sous-objet distinct au lieu d’avoir ses propriétés au niveau supérieur.
Embeddable.EmbeddableType.GROUPING) (
public record Manufacturer( String name, String address, String contactNumber) {}
Structure Plate
Une structure plate garde les informations connexes dans le même document, incorporant des listes ou des champs imbriqués directement. Jakarta NoSQL permet cela en utilisant @Embeddable(Embeddable.EmbeddableType.FLAT)
. Cette approche est bénéfique lorsque vous souhaitez un accès rapide à tous les détails sans nécessiter de requêtes complexes.
Exemple :
{
"_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"]
}
Cette approche stocke directement les détails du fabricant dans le document au lieu de les regrouper dans des champs séparés.
Embeddable.EmbeddableType.FLAT) (
public record Manufacturer( String name, String address, String contactNumber) {}
Exemple d’utilisation dans Jakarta NoSQL
Le snippet de code suivant démontre comment Jakarta NoSQL intègre ces structures :
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);
}
}
}
Choisir la Bonne Approche
- Utilisez une structure plate lorsque vous avez besoin d’une mise en page de document plus simple avec toutes les propriétés au même niveau.
- Utilisez une structure groupée lorsque vous organisez des données connexes en sous-objets logiques pour améliorer la lisibilité et la maintenabilité.
Conclusion
Jakarta NoSQL offre une flexibilité dans la structuration des documents MongoDB en utilisant @Embeddable(Embeddable.EmbeddableType)
. Choisir des structures plates ou groupées dépend de vos modèles d’accès aux données et de vos préférences de modélisation. Comprendre ces approches permet de concevoir une base de données efficace, rendant les requêtes plus performantes tout en maintenant votre modèle de domaine propre et bien structuré.
Pour le code complet, visitez le dépôt GitHub.
Vidéo
Source:
https://dzone.com/articles/handling-embedded-data-in-nosql-with-java