Construindo com padrões: o padrão Attribute
Avaliar este tutorial
Welcome back to the Building with Patterns series. Last time we looked
at the Polymorphic Pattern which covers
situations when all documents in a collection are of similar, but not
identical, structure. In this post, we'll take a look at the Attribute
Pattern.
O Padrão de Atributo é particularmente adequado quando:
- We have big documents with many similar fields but there is a subset of fields that share common characteristics and we want to sort or query on that subset of fields, or
- The fields we need to sort on are only found in a small subset of documents, or
- Ambas as condições acima são atendidas nos documentos.
Por motivos de desempenho, para otimizar nossa pesquisa, provavelmente precisaremos de muitos índices para contabilizar todos os subconjuntos. A criação de todos esses índices pode reduzir o desempenho. O Attribute Pattern fornece uma boa solução para esses casos.
Let's think about a collection of movies. The documents will likely have similar fields involved across all of the documents: title, director,
producer, cast, etc. Let's say we want to search on the release date. A
challenge that we face when doing so, is which release date? Movies
are often released on different dates in different countries.
1 { 2 title: "Star Wars", 3 director: "George Lucas", 4 ... 5 release_US: ISODate("1977-05-20T01:00:00+01:00"), 6 release_France: ISODate("1977-10-19T01:00:00+01:00"), 7 release_Italy: ISODate("1977-10-20T01:00:00+01:00"), 8 release_UK: ISODate("1977-12-27T01:00:00+01:00"), 9 ... 10 }
A busca por uma data de lançamento exigirá a análise de muitos campos ao mesmo tempo. Para pesquisar rapidamente as datas de lançamento, precisaríamos
vários índices em nossa coleção de filmes:
1 {release_US: 1} 2 {release_France: 1} 3 {release_Italy: 1} 4 ...
Usando o Attribute Pattern, podemos mover esse subconjunto de informações para uma matriz e reduzir as necessidades de indexação. Transformamos essas informações em uma array de pares de valores-chave:
1 { 2 title: "Star Wars", 3 director: "George Lucas", 4 ... 5 releases: [ 6 { 7 location: "USA", 8 date: ISODate("1977-05-20T01:00:00+01:00") 9 }, 10 { 11 location: "France", 12 date: ISODate("1977-10-19T01:00:00+01:00") 13 }, 14 { 15 location: "Italy", 16 date: ISODate("1977-10-20T01:00:00+01:00") 17 }, 18 { 19 location: "UK", 20 date: ISODate("1977-12-27T01:00:00+01:00") 21 }, 22 ... 23 ], 24 ... 25 }
A indexação se torna muito mais gerenciável com a criação de um índice nos elementos
elementos da matriz:
1 { "releases.location": 1, "releases.date": 1}
Usando o Attribute Pattern, podemos adicionar organização aos nossos documentos para características comuns e considerar campos raros/imprevisíveis. Por exemplo, um filme lançado em um evento novo ou pequeno. Além disso, a mudança para uma convenção de chave/valor permite o uso de nomes não determinísticos e a fácil adição de qualificadores. Por exemplo, se nossa coleta de dados fosse sobre garrafas de água, nossos atributos poderiam ser mais ou menos assim:
1 "specs": [ 2 { k: "volume", v: "500", u: "ml" }, 3 { k: "volume", v: "12", u: "ounces" } 4 ]
Aqui, dividimos as informações em chaves e valores, "k" e "v," e adicionamos um terceiro campo, "u,", que permite que as unidades de medida sejam armazenadas separadamente.
1 {"specs.k": 1, "specs.v": 1, "specs.u": 1}
O Attribute Pattern é adequado para esquemas que têm conjuntos de campos com o mesmo tipo de valor, como listas de datas. Também funciona bem ao trabalhar com as características dos produtos. Alguns produtos, como roupas, podem ter tamanhos expressos em pequeno, médio ou grande. Outros produtos da mesma coleção podem ser expressos em volume. No entanto, outros podem ser expressos em dimensões físicas ou peso.
A customer in the domain of asset management recently deployed their solution using the Attribute Pattern. The customer uses the pattern to store all characteristics of a given asset. These characteristics are seldom common across the assets or are simply difficult to predict at design time. Relational models typically use a complicated design process to express the same idea in the form of user-defined fields.
Embora muitos dos campos no catálogo de produtos sejam semelhantes, como nome, fornecedor, fabricante, país de origem etc., as especificações ou atributos do item podem ser diferentes. Se seus padrões de acesso a aplicativos e dados dependem da pesquisa em vários desses campos diferentes ao mesmo tempo, o Padrão de Atributo fornece uma boa estrutura para os dados.
O Padrão de Atributo facilita a indexação dos documentos, direcionando muitos campos semelhantes por documento. Ao mover esse subconjunto de dados para um subdocumento de valor-chave, podemos usar nomes de campo não determinísticos, adicionar qualificadores adicionais às informações e declarar com mais clareza a relação do campo e valor originais. Quando usamos o Attribute Pattern, precisamos de menos índices, nossas consultas se tornam mais simples de escrever e mais rápidas.