Las bases de datos NoSQL difieren de las bases de datos relacionales al permitir estructuras más complejas sin necesidad de relaciones tradicionales como uno a muchos o uno a uno. En lugar de eso, las bases de datos NoSQL aprovechan tipos flexibles, como matrices o subdocumentos, para almacenar datos relacionados de manera eficiente dentro de un solo documento. Esta flexibilidad permite a los desarrolladores diseñar modelos que se adapten a las necesidades de consulta y rendimiento de su aplicación.
Jakarta NoSQL es un marco de Java que simplifica las interacciones con bases de datos NoSQL, incluido MongoDB. Proporciona anotaciones que determinan cómo se mapean y almacenan los datos, lo que permite a los desarrolladores controlar si los objetos incrustados se agrupan o se almacenan de manera plana.
Al trabajar con MongoDB y Jakarta NoSQL, una de las consideraciones clave es cómo estructurar sus documentos. Elegir entre una estructura plana y una estructura agrupada afecta cómo se almacenan, consultan y recuperan los datos. En este artículo, exploramos estos dos enfoques utilizando un ejemplo práctico.
Jakarta NoSQL y la entidad Producto
Para comprender las estructuras plana y agrupada, primero presentemos la entidad Producto
y veamos cómo funcionan las anotaciones de 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();
}
}
Ahora, exploremos cómo el campo fabricante
puede almacenarse de manera diferente según las anotaciones de Jakarta NoSQL.
Entendiendo Estructuras Agrupadas y Planas
Estructura Agrupada
Una estructura agrupada organiza la información relacionada en objetos distintos dentro del documento. Este enfoque mejora la legibilidad y permite una práctica de modelado de dominio más limpia. Jakarta NoSQL logra esto utilizando @Embeddable(Embeddable.EmbeddableType.GROUPING)
.
Ejemplo:
{
"_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"]
}
Aquí, el fabricante está agrupado en un sub-objeto separado en lugar de tener sus propiedades en el nivel superior.
Embeddable.EmbeddableType.GROUPING) (
public record Manufacturer( String name, String address, String contactNumber) {}
Estructura Plana
Una estructura plana mantiene la información relacionada dentro del mismo documento, incrustando listas o campos anidados directamente. Jakarta NoSQL permite esto utilizando @Embeddable(Embeddable.EmbeddableType.FLAT)
. Este enfoque es beneficioso cuando se desea acceder rápidamente a todos los detalles sin necesidad de consultas complejas.
Ejemplo:
{
"_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"]
}
Este enfoque almacena los detalles del fabricante directamente en el documento en lugar de agruparlos en campos separados.
Embeddable.EmbeddableType.FLAT) (
public record Manufacturer( String name, String address, String contactNumber) {}
Ejemplo de Uso en Jakarta NoSQL
El siguiente fragmento de código demuestra cómo Jakarta NoSQL integra estas estructuras:
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);
}
}
}
Elección del Enfoque Correcto
- Utilice una estructura plana cuando necesite un diseño de documento más simple con todas las propiedades en el mismo nivel.
- Utilice una estructura agrupada cuando organice datos relacionados en sub-objetos lógicos para mejorar la legibilidad y mantenibilidad.
Conclusión
Jakarta NoSQL ofrece flexibilidad en la estructuración de documentos MongoDB utilizando @Embeddable(Embeddable.EmbeddableType)
. Elegir estructuras planas o agrupadas depende de los patrones de acceso a datos y preferencias de modelado. Comprender estos enfoques permite un diseño de base de datos eficiente, lo que hace que las consultas sean más efectivas mientras mantiene limpio y bien estructurado su modelo de dominio.
Para ver el código completo, visite el repositorio de GitHub.
Video
Source:
https://dzone.com/articles/handling-embedded-data-in-nosql-with-java