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>

questionAnswers(9)

yourAnswerToTheQuestion