I database NoSQL differiscono dai database relazionali perché consentono strutture più complesse senza richiedere relazioni tradizionali come uno-a-molti o uno-a-uno. Invece, i database NoSQL sfruttano tipi flessibili, come array o subdocumenti, per archiviare dati correlati in modo efficiente all’interno di un singolo documento. Questa flessibilità consente agli sviluppatori di progettare modelli che soddisfano le esigenze di interrogazione e prestazioni della propria applicazione.
Jakarta NoSQL è un framework Java che semplifica le interazioni con i database NoSQL, inclusi MongoDB. Fornisce annotazioni che determinano come i dati vengono mappati e archiviati, consentendo agli sviluppatori di controllare se gli oggetti incorporati sono raggruppati o archiviati in modo piatto.
Nel lavoro con MongoDB e Jakarta NoSQL, una delle considerazioni chiave è come strutturare i documenti. Scegliere tra una struttura piatta e una struttura raggruppata influenza il modo in cui i dati vengono archiviati, interrogati e recuperati. In questo articolo, esploriamo questi due approcci utilizzando un esempio pratico.
Jakarta NoSQL e Entità Prodotto
Per comprendere le strutture piatte e raggruppate, introduciamo prima l’entità Prodotto
e vediamo come funzionano le annotazioni di 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();
}
}
Ora, esploriamo come il campo produttore
può essere archiviato in modo diverso in base alle annotazioni di Jakarta NoSQL.
Comprensione delle Strutture Raggruppate e Piatte
Struttura Raggruppata
Una struttura raggruppata organizza informazioni correlate in oggetti distinti all’interno del documento. Questo approccio migliora la leggibilità e consente una pratica di modellazione del dominio più pulita. Jakarta NoSQL raggiunge questo obiettivo utilizzando @Embeddable(Embeddable.EmbeddableType.GROUPING)
.
Esempio:
{
"_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"]
}
Qui, il produttore è raggruppato in un sotto-oggetto separato invece di avere le sue proprietà a livello superiore.
Embeddable.EmbeddableType.GROUPING) (
public record Manufacturer( String name, String address, String contactNumber) {}
Struttura Piatta
Una struttura piatta mantiene informazioni correlate all’interno dello stesso documento, incorporando liste o campi annidati direttamente. Jakarta NoSQL consente questo utilizzando @Embeddable(Embeddable.EmbeddableType.FLAT)
. Questo approccio è vantaggioso quando si desidera un accesso rapido a tutti i dettagli senza richiedere query complesse.
Esempio:
{
"_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"]
}
Questo approccio memorizza i dettagli del produttore direttamente nel documento invece di raggrupparli in campi separati.
Embeddable.EmbeddableType.FLAT) (
public record Manufacturer( String name, String address, String contactNumber) {}
Esempio di Utilizzo in Jakarta NoSQL
Il seguente frammento di codice dimostra come Jakarta NoSQL integri queste strutture:
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);
}
}
}
Scegliere l’Approccio Giusto
- Utilizza una struttura piatta quando hai bisogno di un layout di documento più semplice con tutte le proprietà allo stesso livello.
- Utilizza una struttura raggruppata quando organizzi dati correlati in sotto-oggetti logici per migliorare la leggibilità e la manutenibilità.
Conclusione
Jakarta NoSQL offre flessibilità nella strutturazione dei documenti MongoDB utilizzando @Embeddable(Embeddable.EmbeddableType)
. La scelta tra flat o grouped dipende dai tuoi modelli di accesso ai dati e dalle preferenze di modellazione. Comprendere questi approcci consente un design efficiente del database, rendendo le query più efficaci mantenendo il tuo modello di dominio pulito e ben strutturato.
Per il codice completo, visita il repository GitHub.
Video
Source:
https://dzone.com/articles/handling-embedded-data-in-nosql-with-java