Pergunta

A Relatório pode ter várias paradas. O Gráfico aparência da tabela da seguinte forma:

  • Gráfico - ID , ChartId , reportId , ...

O ChartId acima pode mapear para o ChartId , quer um dos seguintes tipos de gráfico:

  • Linha : ChartId , Espessura , yaxis , XAxis , Cor , ...
  • Pie : ChartId , Radius , Cor , ...
  • Bar : ChartId , Largura , Cor , Border , .. .

Estou usando o SQL Server e soluções infelizmente alternativas como o uso de CouchDB etc não são opções viáveis. Eu também pretende mapear estas tabelas para entidades usando o Entity Framework.

Este projeto é a minha primeira tentativa e vejo vários problemas com este projeto:

  1. Gráfico . reportId não pode ser uma chave estrangeira em várias mesas para impor uma FK é um problema.
  2. Ao executar um SQL (Ou Linq) consulta, eu vou ter que fazer qualquer executar duas consultas para obter o tipo de gráfico e, em seguida, consultar tabela. Ou, eu vou ter que executar um join , contra todas as tabelas para obter os dados do gráfico.
  3. Ao fazer uma junção contra os tipos de gráfico, O ChartId através destas tabelas precisa ser tão único Gráfico . ChartId mapeia para apenas um de Linha . ChartId ou Bar . ChartId ou Pie . ChartId .
  4. O mapeamento deste com a EF vai ser complicado.

Eu imagino que este é um problema bastante comum que não são prescritos soluções e estabeleceram maneiras de lidar com ele.

Am I no caminho certo com o projeto? E se assim for, como superar os problemas acima (FK, juntar, id único em várias tabelas e mapeamento).

Solução

Esta resposta é bastante abrangente sobre as estratégias. E o artigo de SQL Team em implementação de herança de tabela no SQL Server me tem onde eu queria.

Foi útil?

Solução

Você já considerou colocar as cartas na mesma tabela e usando uma tabela per padrão herança hierarquia? O link não mostra como implementar isso no Entity Framework. Se é ou não é viável depende de quão diferente todos os tipos de gráficos será e quantos campos cada um precisa.

Há também Tabela por herança tipo que é mais semelhante ao que você já está descrevendo.

Outras dicas

Eu resolver este com um esquema de herança de tabela:

Chart (ChartId, ChartTypeId)
   PK (ChartId, ChartTypeId)
   CHECK ChartTypeId IN ('Line', 'Bar', 'Pie')

LineChart (ChartId, ChartTypeId)
   PK (ChartId, ChartTypeId)
   FK (ChartId, ChartTypeId) -> Chart
   CHECK ChartTypeId IN ('Line')

Para adicionar um gráfico, primeiro você adicionar a "base" da tabela gráfico e, em seguida, para apropriado "subtipo" table chart o. As restrições de verificação manter tudo em linha.

Os gráficos de linhas. gráficos de pizza e gráficos de barras são especializados formas de gráficos.

Lookup "generalização especialização modelagem relacional" para bons artigos sobre esse padrão.

Ou, eu vou ter que executar uma junção contra todas as tabelas para obter os dados do gráfico.

Sim, e isso é bom.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top