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 aproveitam 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 as interações com bancos de dados NoSQL, incluindo o MongoDB. Ele fornece anotações que determinam como os dados são mapeados e armazenados, permitindo que os desenvolvedores controlem se os objetos incorporados são agrupados ou armazenados de forma plana.
Ao trabalhar com MongoDB e Jakarta NoSQL, uma das considerações-chave é como estruturar seus documentos. Escolher 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 de Produto
Para entender as estruturas plana e agrupada, vamos primeiro introduzir a entidade Product
e ver como as anotações do Jakarta NoSQL funcionam:
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 manufacturer
pode ser armazenado de forma diferente com base nas anotações do Jakarta NoSQL.
Compreendendo 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. O Jakarta NoSQL alcança isso usando @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. O Jakarta NoSQL permite isso usando @Embeddable(Embeddable.EmbeddableType.FLAT)
. Essa abordagem é benéfica quando você deseja acesso rápido a todos os detalhes sem a necessidade de 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"]
}
Esta 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 trecho de código a seguir 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 ao organizar dados relacionados em sub-objetos lógicos para melhorar a legibilidade e a manutenção.
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 o código completo, visite o repositório GitHub.
Vídeo
Source:
https://dzone.com/articles/handling-embedded-data-in-nosql-with-java