Pergunta

Não tenho certeza se isso é possível ou se se enquadra na categoria de tabelas dinâmicas, mas resolvi procurar os profissionais para ver.

Eu tenho três tabelas básicas:Cartão, Propriedade e CardProperty.Como os cartões não têm as mesmas propriedades e, muitas vezes, vários valores para a mesma propriedade, decidi usar a abordagem da tabela de união para armazenar dados, em vez de ter uma estrutura de colunas realmente grande na minha tabela de cartões.

A tabela de propriedades é uma tabela básica de tipo de palavra-chave/valor.Então você tem a palavra-chave ATK e o valor atribuído a ela.Existe outra propriedade chamada SpecialType para a qual um cartão pode ter vários valores, como "Sycnro" e "DARK"

O que eu gostaria de fazer é criar uma visualização ou procedimento armazenado que forneça o ID do cartão, o nome do cartão e todas as palavras-chave de propriedade atribuídas ao cartão como colunas e seus valores no ResultSet para um cartão especificado.Então, idealmente, eu teria um conjunto de resultados como:

ID  NAME                   SPECIALTYPE
1   Red Dragon Archfiend   Synchro
1   Red Dragon Archfiend   DARK
1   Red Dragon Archfiend   Effect

e eu poderia contabilizar meus resultados dessa maneira.

Acho que ainda mais inteligente seria simplesmente concatenar as propriedades com base em suas palavras-chave, para que eu pudesse gerar um ResultSet como:

1  Red Dragon Archfiend   Synchro/DARK/Effect

..mas não sei se isso é viável.

Ajude-me a empilhar Kenobi!Você é minha única esperança.

Outras dicas

Relacionados, mas os valores são mantidos em colunas separadas e você conhece seus "tipos especiais" com antecedência:
Consulta SQL para comparar vendas de produtos por mês

Caso contrário, eu faria isso com o cursor em um procedimento armazenado ou pré-formaria a transformação na camada de negócios ou de apresentação.

Apunhale o sql se você conhece todos os casos:

Select
    ID,NAME
    ,Synchro+DARK+Effect --  add a some substring logic to trim any trailing /'s
from
    (select
        ID
        ,NAME
        --may need to replace max() with min().
        ,MAX(CASE SPECIALTYPE WHEN "Synchro" THEN SPECIALTYPE +"/" ELSE "" END) Synchro
        ,MAX(CASE SPECIALTYPE WHEN "DARK" THEN SPECIALTYPE +"/" ELSE "" END) DARK
        ,MAX(CASE SPECIALTYPE WHEN "Effect" THEN SPECIALTYPE ELSE "" END) Effect
    from
        table
    group by
       ID
       ,NAME) sub1

Não recolha por concatenação para armazenamento de registros relacionados em seu banco de dados.Não são exatamente as melhores práticas.

O que você está descrevendo é uma tabela dinâmica.As tabelas dinâmicas são duro.Eu sugeriria evitá-los, se possível.

Por que não apenas ler suas linhas relacionadas e processá-las na memória?Não parece que você vai gastar muitos milissegundos fazendo isso...

Uma opção é fazer com que as Propriedades tenham um PropertyType, então:

table cards
integer ID | string name | ... (other properties common to all Cards)

table property_types
integer ID | string name | string format | ... (possibly validations)

table properties
integer ID | integer property_type_id | string name | string value
foreign key property_type_id references property_types.ID

table cards_properties
integer ID | integer card_id | integer property_id
foreign key card_id references cards.ID
foreign key property_id references propertiess.ID

Dessa forma, quando você quiser definir um novo valor de propriedade, poderá validá-lo pelo seu tipo.Um tipo poderia ser "SpecialType" com uma enumeração de valores.

Eu tenho um tipo/formato para minha tabela de propriedades, assim sei como converter/avaliar quando estou lidando com um valor inteiro.Eu não tinha certeza se era pertinente a esse problema ou não.

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