Pergunta

No MySQL, é geralmente mais rápido / mais eficiente / escalável para retornar 100 linhas com 3 colunas, ou 1 linha com 100 colunas?

Em outras palavras, quando armazenar muitos key => pares de valor relacionado a um registro, é melhor para armazenar cada chave => pares de valor em uma linha separada com o record_id como uma chave, ou ter uma linha por record_id com uma coluna para cada tecla?

Além disso, assumem também que as chaves terão de ser adicionados / removidos com bastante regularidade, que eu suponho que afetaria a manutenção a longo prazo da abordagem coluna muitos uma vez que a mesa fica suficientemente grande.

Editar:. para esclarecer, por "uma base regular" Quero dizer a adição ou remoção de uma chave, uma vez por mês ou assim

Foi útil?

Solução

Você nunca deve adicionar ou remover colunas em uma base regular.

Outras dicas

http://en.wikipedia.org/wiki/Entity-Attribute-Value_model

Há um monte de coisas ruins sobre este modelo e eu não iria utilizá-lo se houvesse qualquer outra alternativa. Se você não sabe a maioria (exceto alguns campos personalizados pelo utilizador) de colunas de dados que você precisa para sua aplicação, então você precisa gastar mais tempo no projeto e figura-lo.

Se suas chaves são predefinidos (conhecido em tempo de design), então sim, você deve colocar cada chave em uma coluna separada.

Se eles não são conhecidos em tempo de design, então você tem que devolver seus dados como uma lista de pares chave-valor que você deve fora depois analisar o RDBMS.

Se você estiver armazenando pares de chave / valor, você deve ter uma tabela com duas colunas, uma para a chave (tornar este o PK para a tabela) e outro para o valor (provavelmente não precisa deste indexados em tudo) . Lembre-se, "A chave, a chave inteira, e nada mas a chave."

Na abordagem multi-coluna, você vai achar que você mesa cresce sem limites porque a remoção da coluna vai detonar todos os valores e você não vai querer fazê-lo. Falo por experiência aqui tendo trabalhado em um sistema legado que tinha uma mesa com quase 1000 colunas, a maioria dos quais eram campos de bits. Eventualmente, você parar de ser capaz de fazer o caso para eliminar qualquer uma das colunas porque alguém pode ser usá-lo e a última vez que você fez isso, você teve trabalho até 2 am reverter para backups.

Primeiro: determinar a freqüência com seus dados precisam ser acessado. Se os dados sempre precisa ser recuperada em um tiro e mais do que usado, então considerar o armazenamento de todos os pares de chaves como um valor serializado ou como um valor XML. Se você precisa fazer qualquer tipo de análise complexa em que os dados e você precisa os pares de valores, em seguida, colunas são ok, mas limitá-los a valores que você sabe que você vai precisar para realizar suas consultas on. Em geral, é mais fácil criar consultas que usam uma coluna para um parâmetro de linha. Você também vai encontrá-lo mais fácil de trabalhar os valores retornados se eles estão todos em uma linha do que muitos.

Segundo: separar seus dados acessados ??com mais frequência e colocá-lo em sua própria mesa e outros dados em outro. 100 colunas é muito pela maneira que eu recomendo que você dividir seus dados em pequenos pedaços que serão mais administrável.

Finalmente: Se você tiver dados que podem freqüentemente mudam, então você deve usar criar a coluna (chave) em uma tabela e, em seguida, usar o seu valor de chave numérica com a qual você iria armazenar o valor da chave. Isso pressupõe que você estará usando a mesma chave mais de uma vez e deve acelerar a sua pesquisa quando você vai fazer a sua pesquisa.

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