É seguro dizer que o modelo de banco de dados EAV / CR é ruim. Dito isto,
Pergunta: Que modelo, técnica ou padrão de banco de dados deve ser usado para lidar com "classes" de atributos que descrevem produtos de comércio eletrônico que podem ser alterados em tempo de execução?
Em um bom banco de dados de comércio eletrônico, você armazenará classes de opções (como resolução de TV e, em seguida, uma resolução para cada TV, mas o próximo produto pode não ser uma TV e não ter "resolução de TV"). Como você os armazena, pesquisa com eficiência e permite que seus usuários configurem tipos de produtos com campos variáveis que descrevem seus produtos? Se o mecanismo de pesquisa descobrir que os clientes geralmente pesquisam TVs com base na profundidade do console, você pode adicionar a profundidade do console aos seus campos e adicionar uma profundidade única para cada tipo de produto de TV em tempo de execução.
Há um bom recurso comum entre os bons aplicativos de comércio eletrônico, nos quais eles mostram um conjunto de produtos e, em seguida, têm menus laterais "detalhados", nos quais é possível ver "Resolução da TV" como um cabeçalho e as cinco principais resoluções de TV mais comuns para o conjunto encontrado. Você clica em um e ele mostra apenas TVs com essa resolução, permitindo aprofundar a seleção, selecionando outras categorias no menu lateral. Essas opções seriam os atributos dinâmicos do produto adicionados no tempo de execução.
Discussão adicional:
Para encurtar a história, existem links na Internet ou descrições de modelos que possam "academicamente" corrigir a seguinte configuração? Agradeço a Noel Kennedy por sugerir uma tabela de categorias, mas a necessidade pode ser maior que isso. Descrevo-o de uma maneira diferente abaixo, tentando destacar o significado. Talvez eu precise de uma correção de ponto de vista para resolver o problema, ou talvez precise aprofundar o EAV / CR.
Adore a resposta positiva ao modelo EAV / CR. Meus colegas desenvolvedores dizem o que Jeffrey Kemp abordou abaixo: "novas entidades devem ser modeladas e projetadas por um profissional" (fora do contexto, leia sua resposta abaixo). O problema é:
- entidades adicionam e removem atributos semanalmente
(as palavras-chave de pesquisa determinam atributos futuros) - novas entidades chegam semanalmente
(os produtos são montados a partir de peças) - entidades antigas desaparecem semanalmente
(arquivadas, menos populares, sazonais)
O cliente deseja adicionar atributos aos produtos por dois motivos:
- departamento / pesquisa de palavras-chave / gráfico de comparação entre produtos similares
- configuração do produto de consumo antes da finalização da compra
Os atributos devem ter significado, não apenas uma pesquisa por palavra-chave. Se eles quiserem comparar todos os bolos com "glacê de chantilly", eles podem clicar em bolos, clicar no tema do aniversário, clicar em glacê de chantilly e verificar todos os bolos que são interessantes, sabendo que todos têm glacê de chantilly. Isso não é específico para bolos, apenas um exemplo.
fonte
Respostas:
Existem alguns prós e contras gerais em que consigo pensar, há situações em que uma é melhor que a outra:
Opção 1, modelo EAV:
Opção 2, Modelando cada entidade separadamente:
Opção 3, combinação (entidades de modelo "corretamente", mas adicione "extensões" para atributos personalizados para algumas / todas as entidades)
* Não tenho certeza se a opção 3 necessariamente pouparia algum tempo na fase de design.
Pessoalmente, eu me inclinaria para a opção 2 e evitaria o EAV sempre que possível. No entanto, para alguns cenários, os usuários precisam da flexibilidade que acompanha o EAV; mas isso tem um ótimo custo.
fonte
Não, não é. Só que eles são um uso ineficiente de bancos de dados relacionais. Uma loja puramente de chave / valor funciona muito bem com este modelo.
Agora, para sua verdadeira pergunta: como armazenar vários atributos e mantê-los pesquisáveis?
Basta usar o EAV. No seu caso, seria uma única mesa extra. indexá-lo no nome e no valor do atributo, a maioria dos RDBMs usaria compactação de prefixo nas repetições de nomes de atributos, tornando-o realmente rápido e compacto.
O EAV / CR fica feio quando você o usa para substituir os campos 'reais'. Como em todas as ferramentas, o uso excessivo é "ruim" e gera uma imagem ruim.
fonte
hstore
campo (apenas uma das razões pelas quais usar o PostgreSQL)http://code.google.com/p/xee/source/browse/trunk/XeePhotoshopLoader.m?spec=svn28&r=11#107
Os modelos internos são malucos, na melhor das hipóteses, como alguém colocar o esquema em um jogo de boggle, selá-lo e colocá-lo em um shacker de tinta ...
Mundo real: estou trabalhando em um aplicativo de atendimento de midware e aqui estão uma das consultas para obter informações de endereço.
Extrai informações de endereço de um pedido, preguiçosamente
-
Resumo: Use o Magento apenas se:
fonte
Estou surpreso que ninguém tenha mencionado os bancos de dados NoSQL.
Nunca pratiquei o NoSQL em um contexto de produção (acabei de testar o MongoDB e fiquei impressionado), mas o objetivo principal do NoSQL é poder salvar itens com atributos variados no mesmo "documento".
fonte
Onde o desempenho não é um requisito importante, como em um tipo de aplicativo ETL, o EAV tem outra vantagem distinta: economia de diferencial.
Eu implementei um número de aplicativos em que um requisito abrangente era a capacidade de ver o histórico de um objeto de domínio desde sua primeira "versão" até seu estado atual. Se esse objeto de domínio tiver um grande número de atributos, isso significa que cada alteração exige que uma nova linha seja inserida em sua tabela correspondente (não uma atualização porque o histórico seria perdido, mas uma inserção). Digamos que esse objeto de domínio seja uma Pessoa, e eu tenho 500 mil Pessoas para rastrear com uma média de mais de 100 alterações ao longo do ciclo de vida de Pessoas em vários atributos. Associe isso ao fato de que raro é o aplicativo que possui apenas um objeto de domínio principal e você rapidamente pressupõe que o tamanho do banco de dados crescerá rapidamente fora de controle.
Uma solução fácil é salvar apenas as alterações diferenciais nos principais objetos do domínio, em vez de salvar repetidamente informações redundantes.
Todos os modelos mudam ao longo do tempo para refletir novas necessidades de negócios. Período. Usar o EAV é apenas uma das ferramentas em nossa caixa para usar; mas nunca deve ser automaticamente classificado como "ruim".
fonte
Estou lutando com o mesmo problema. Pode ser interessante verificar a seguinte discussão sobre duas soluções de comércio eletrônico existentes: Magento (EAV) e Joomla (estrutura relacional regular): https://forum.virtuemart.net/index.php?topic=58686.0
Parece que o desempenho de EAV do Magento é um verdadeiro empecilho.
É por isso que estou inclinado a uma estrutura normalizada. Para superar a falta de flexibilidade, estou pensando em adicionar um dicionário de dados separado no futuro (XML ou tabelas de banco de dados separadas) que possam ser editados e, com base nisso, o código do aplicativo para exibir e comparar categorias de produtos com novos atributos seria gerado, juntamente com scripts SQL.
Essa arquitetura parece ser o ponto mais interessante nesse caso - flexível e com bom desempenho ao mesmo tempo.
O problema pode ser o uso frequente de ALTER TABLE em ambiente ativo. Estou usando o Postgres, portanto, esperamos que seu MVCC e DDL transacional aliviem a dor.
fonte
Ainda voto na modelagem no nível atômico de menor significado para o EAV. Permita que padrões, tecnologias e aplicativos voltados para determinada comunidade de usuários decidam modelos de conteúdo, necessidades de repetição de atributos, grãos, etc.
fonte
Se se trata apenas dos atributos do catálogo de produtos e, portanto, os requisitos de validação para esses atributos são bastante limitados, a única desvantagem real do EAV é o desempenho da consulta e isso é apenas um problema quando sua consulta lida com várias "coisas" (produtos) com atributos, o desempenho da consulta "fornece todos os atributos para o produto com o ID 234", embora não seja o ideal, ainda é bastante rápido.
Uma solução é usar o modelo de banco de dados SQL / EAV apenas para o lado admin / edit do catálogo de produtos e ter algum processo que desnormalize os produtos em algo que o torne pesquisável. Como você já possui atributos e, portanto, é bem provável que deseje facetas, isso pode ser Solr ou ElasticSearch. Essa abordagem evita basicamente todas as desvantagens do modelo EAV e a complexidade adicionada é limitada à serialização de um produto completo para o JSON na atualização.
fonte
O EAV tem muitos inconvenientes:
fonte
Eu tenho um problema um pouco diferente: em vez de muitos atributos com valores esparsos (que é possivelmente um bom motivo para usar o EAV), quero armazenar algo mais como uma planilha. As colunas na planilha podem mudar, mas dentro de uma planilha todas as células conterão dados (não esparsos).
Fiz um pequeno conjunto de testes para comparar dois projetos: um usando EAV e outro usando o Postgres ARRAY para armazenar dados de células.
EAV
Matriz
Ambos os esquemas têm índices nas colunas apropriadas e os índices são usados pelo planejador.
Descobriu -se que o esquema baseado em matriz era uma ordem de magnitude mais rápida para inserções e consultas. A partir de testes rápidos, parecia que ambos eram dimensionados linearmente. Os testes não são muito completos, no entanto. Sugestões e garfos são bem-vindos - eles estão sob uma licença do MIT.
fonte