Como armazenar metadados em colunas
Digamos que você esteja coletando informações privilegiadas sobre os próximos lançamentos de filmes de super-heróis e sua principal tabela de filmes seja algo assim:
tabela 1
<code>Title Director Leading Male Leading Female Villain -------------------------------------------------------------------------- Green Lantern Kubrick Robert Redford Miley Cyrus Hugh Grant The Tick Mel Gibson Kevin Sorbo Linda Hunt Anthony Hopkins </code>
Isso deve funcionar muito bem em geral e permitir consultas muito fáceis, bem como comparações entre linhas.
No entanto, você gostaria de acompanhar a origem de cada fato de dados, bem como o nome do jornalista que descobriu o fato. Isso parece sugerir algum tipo deEAV mesa assim:
mesa 2
<code>Movie Attribute Value Source Journalist ---------------------------------------------------------------------------------- Green Lantern Director Kubrick CHUD Sarah Green Lantern Leading Male Robert Redford CHUD James Green Lantern Leading Female Miley Cyrus Dark Horizons James Green Lantern Villain Hugh Grant CHUD Sarah The Tick Director Mel Gibson Yahoo Cameron ... </code>
Que, embora capture facilmente os meta-dados que queríamos, torna as consultas mais difíceis. Demora um pouco mais para simplesmente obter todos os dados básicos de um único filme. Mais especificamente, você tem que lidar com quatro linhas aqui para obter as quatro informações importantes sobre a Lanterna Verde, enquanto na Tabela 1 é uma única linha bem encapsulada.
Então, minha pergunta é, à luz das complicações que acabei de descrever, e porque eu sei que, em geral, as tabelas EAV devem ser evitadas, o EAV ainda é a melhor solução? Parece que é a única maneira razoável de representar esses dados. A única outra alternativa que vejo é usar a tabela 1 em conjunto com outra quesó armazena dados meta como este:
Tabela 3
<code>Movie Attribute Source Journalist ---------------------------------------------------------------------------------- Green Lantern Director CHUD Sarah Green Lantern Leading Male CHUD James Green Lantern Leading Female Dark Horizons James Green Lantern Villain CHUD Sarah The Tick Director Yahoo Cameron ... </code>
Mas isso é muito perigoso porque se alguém alterar o nome de uma coluna na tabela 1, como "Vilão" para "Vilão Principal", a linha na tabela 3 ainda simplesmente dirá "Vilão" e, portanto, os dados relacionados serão desacoplados. Isso poderia ser ajudado se a coluna "atributo" estivesse vinculada a outra tabela que servia como uma enumeração das colunas da tabela 1. É claro que o DBA seria responsável por manter essa tabela de enumeração para corresponder às colunas reais da tabela 1. E Na verdade, talvez seja possível melhorar isso ainda mais, em vez de criar a tabela de enumeração manualmente; use uma exibição do sistema no SQL Server que hospede os nomes das colunas na tabela 1. Embora não esteja certo de que você possa ter relacionamentos que envolvam visualizações do sistema.
O que você sugere? O EAV é o único caminho a percorrer?
E se fosse apenas uma coluna de meta-dados (apenas "Fonte" sem "Jornalista") - ainda é necessário seguir a rota EAV? Você poderia ter colunas "Director", "Director_Source", "Leading Male", "Leading Male_Source", etc., mas isso fica feio muito rapidamente. Existe alguma solução melhor que eu não estou pensando?
Se eu não tiver esclarecido nenhum ponto, por favor, comente e adicionarei mais conforme necessário. Ah sim, e os dados do filme que eu usei são fabricados :)
Edit: Para refazer minha pergunta principal de forma concisa, gostaria de ter a simplicidade e o verdadeiro design do RDBMS da tabela 1, que realmente descreve bem uma entrada de filme, enquanto ainda armazena os metadados sobre os atributos de uma maneira segura e acessível. Isso é possível? Ou o EAV é o único caminho?
Edit 2: Depois de fazer mais pesquisas na web, ainda não encontrei uma discussão sobre o EAV que se concentrasse no desejo de armazenar metadados nas colunas. A principal razão dada para implementar um EAV é quase sempre colunas dinâmicas e imprevisíveis, o que não é o caso no meu exemplo. No meu exemplo, há sempre as mesmas quatro colunas: diretor, líder masculino, líder feminina, vilão. No entanto, quero armazenar alguns fatos (fonte e jornalista) sobre cada coluna para cada linha. Um EAV facilitaria isso, mas eu gostaria de evitar recorrer a isso.
Atualizar
Usando o design Tabela 2, exceto para renomear a coluna "Filme" para "Nome" e chamando a tabela inteira de "Filme", aqui está a operação dinâmica no SQL Server 2008 para voltar Tabela 1:
<code>SELECT Name, [Director], [Leading Male], [Leading Female], [Villain] FROM (Select Name, Attribute, Value FROM Movie) as src PIVOT ( Max(Value) FOR Attribute IN ([Director], [Leading Male], [Leading Female], [Villain]) ) AS PivotTable </code>