Vou oferecer uma opinião contrária à maioria dos comentários sobre esta questão. Enquanto EAV é MAL por todas as razões que você pode encontrar explicadas muitas vezes aqui no SO e DBA.SE e em outros lugares, há uma aplicação muito comum para a qual a maioria das coisas erradas com o EAV são amplamente irrelevantes e as (poucas) vantagens de EAV são muito pertinentes. Esse aplicativo é catálogos de produtos online.
O principal problema com o EAV é que ele não permite que o banco de dados faça o que é realmente bom em fazer, o que é ajudar a dar contexto adequado a diferentes atributos de informações sobre diferentes entidades, organizando-os em um esquema . Ter um esquema traz muitas, muitas vantagens em relação ao acesso, interpretação e aplicação da integridade de seus dados.
O fato sobre os catálogos de produtos é que os atributos de um produto são quase totalmente irrelevantes para o sistema de catálogo em si. Os sistemas de catálogo de produtos fazem (no máximo) três coisas com os atributos do produto.
-
Exiba os atributos do produto em uma lista para os usuários finais no formato:{attribute name}:{attribute value}.
-
Exiba os atributos de vários produtos em uma grade de comparação onde os atributos de produtos diferentes se alinham (os produtos geralmente são colunas, os atributos geralmente são linhas)
-
Direcione regras para algo (por exemplo, preços) com base em combinações específicas de atributo/valor.
Se tudo o que seu sistema faz é regurgitar informações que são semanticamente irrelevantes (para o sistema), então o esquema para essas informações é basicamente inútil. Na verdade, o esquema atrapalha em um catálogo de produtos online, especialmente se o seu catálogo tiver muitos tipos diversos de produtos, porque você sempre terá que voltar ao esquema para mexer nele para permitir novas categorias de produtos ou tipos de atributos.
Por causa de como é usado, mesmo o tipo de dados de um valor de atributo em um catálogo de produtos não é necessariamente (vitalmente) importante. Para alguns atributos, você pode querer impor restrições, como "deve ser um número" ou "deve vir desta lista {...}". Isso depende de quão importante é a consistência de atributo para seu catálogo e quão elaborada você deseja que sua implementação seja. Olhando para os catálogos de produtos de vários varejistas online, eu diria que a maioria está preparada para trocar a simplicidade pela consistência.
Sim, EAV é mau, exceto quando não é.