Bancos de dados NoSQL diferem dos bancos de dados relacionais ao permitir estruturas mais complexas sem exigir relacionamentos tradicionais, como um-para-muitos ou um-para-um. Em vez disso, os bancos de dados NoSQL utilizam tipos flexíveis, como arrays ou subdocumentos, para armazenar dados relacionados de forma eficiente dentro de um único documento. Essa flexibilidade permite que os desenvolvedores projetem modelos que atendam às necessidades de consulta e desempenho de suas aplicações.
Jakarta NoSQL é um framework Java que simplifica interações com bancos de dados NoSQL, incluindo MongoDB. Ele fornece anotações que determinam como os dados são mapeados e armazenados, permitindo que os desenvolvedores controlem se objetos embutidos são agrupados ou armazenados de maneira plana.
Ao trabalhar com MongoDB e Jakarta NoSQL, uma das considerações principais é como estruturar seus documentos. A escolha entre uma estrutura plana e uma estrutura agrupada impacta como os dados são armazenados, consultados e recuperados. Neste artigo, exploramos essas duas abordagens usando um exemplo prático.
Jakarta NoSQL e Entidade Produto
Para entender as estruturas plana e agrupada, vamos primeiro introduzir a entidade Produto
e ver como funcionam as anotações do 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();
}
}
Agora, vamos explorar como o campo fabricante
pode ser armazenado de maneira diferente com base nas anotações do Jakarta NoSQL.
Entendendo Estruturas Agrupadas e Planas
Estrutura Agrupada
Uma estrutura agrupada organiza informações relacionadas em objetos distintos dentro do documento. Essa abordagem melhora a legibilidade e permite uma prática de modelagem de domínio mais limpa. Jakarta NoSQL consegue isso utilizando @Embeddable(Embeddable.EmbeddableType.GROUPING)
.
Exemplo:
{
"_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"]
}
Aqui, o fabricante está agrupado em um sub-objeto separado, em vez de ter suas propriedades no nível superior.
Embeddable.EmbeddableType.GROUPING) (
public record Manufacturer( String name, String address, String contactNumber) {}
Estrutura Plana
Uma estrutura plana mantém informações relacionadas dentro do mesmo documento, incorporando listas ou campos aninhados diretamente. Jakarta NoSQL possibilita isso usando @Embeddable(Embeddable.EmbeddableType.FLAT)
. Essa abordagem é benéfica quando você deseja acesso rápido a todos os detalhes sem exigir consultas complexas.
Exemplo:
{
"_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"]
}
Essa abordagem armazena detalhes do fabricante diretamente no documento, em vez de agrupá-los em campos separados.
Embeddable.EmbeddableType.FLAT) (
public record Manufacturer( String name, String address, String contactNumber) {}
Exemplo de Uso no Jakarta NoSQL
O seguinte trecho de código demonstra como o Jakarta NoSQL integra essas estruturas:
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);
}
}
}
Escolhendo a Abordagem Certa
- Use uma estrutura plana quando precisar de um layout de documento mais simples com todas as propriedades no mesmo nível.
- Use uma estrutura agrupada quando organizar dados relacionados em sub-objetos lógicos para melhorar a legibilidade e a manutenibilidade.
Conclusão
Jakarta NoSQL oferece flexibilidade na estruturação de documentos MongoDB usando @Embeddable(Embeddable.EmbeddableType)
. Escolher estruturas planas ou agrupadas depende dos padrões de acesso aos dados e preferências de modelagem. Compreender essas abordagens permite um design de banco de dados eficiente, tornando as consultas mais eficazes, mantendo seu modelo de domínio limpo e bem estruturado.
Para ver o código completo, visite o repositório GitHub.
Vídeo
Source:
https://dzone.com/articles/handling-embedded-data-in-nosql-with-java