O que devo usar? Uma sequência ou 15 campos inteiros?

9

Estou desenvolvendo um programa de rastreamento de alunos em que preciso armazenar 15 notas de exame.

Posso armazenar as marcas como uma sequência e dividi-las quando necessário, para fins como executar operações aritméticas. No entanto, preciso do máximo de desempenho possível.

Qual é melhor? Um campo de sequência única ou 15 campos int individuais?

Mike
fonte
"15 notas de exame" - assim como múltipla escolha de um único exame ou a pontuação de 15 testes?
Rfusca 31/08/12
pontuações de 15 testes
mike
11
Sem mais informações sobre o tipo de banco de dados (relacional tradicional com indexação disponível?) E os requisitos para acesso a dados e padrões de uso, é difícil dizer qual design você deve usar e como ele será executado.
Cade Roux

Respostas:

27

Se você já está falando sobre divisão e computação, não armazene isso como uma matriz.

Independentemente da teoria relacional e das regras e dogmas tradicionais de normalização, é simplesmente um design que oferece flexibilidade MINIMAL.

Torne cada resultado do exame uma linha.

Não estou tentando antecipar tudo, mas há um número muito grande de coisas que esse design mais granular (e, sim, normalizado) e apenas um pouco mais caro do espaço facilita o que você pode ou não precisar agora e pode ou não usar. pode não ser necessário no futuro:

  • Jogando fora o maior e o menor resultado? Você terá que dividir sua matriz e classificá-la.

  • Média? Você terá que dividir e totalizar

  • Análise do resultado do exame por exame entre os alunos? Você terá que cortar e girar

  • Classificação para contagem (ou instância GCSEs britânicos, onde pode ser 7 As e 2Bs)? Você terá que cortar e classificar

Observe que todo esse fatiamento e classificação são muito baratos em um design normalizado e indexado.

Cade Roux
fonte
4
Apenas o que eu ia dizer, mas você disse isso melhor! Armazenar valores múltiplos em uma sequência é uma das piores opções de design possíveis para qualquer banco de dados.
HLGEM
+1 Ótima explicação adicional da minha. Eu costumo ser muito conciso, lol.
Rfusca 31/08/2012
12

Para pontuações, em termos de desempenho, o vencedor claro está armazenando numericamente algo como isto;

create table test_scores
(
  student_id int,
  test_id int,
  score int
);

É fácil de consultar, fácil de atualizar e adicionar, e super fácil e rápido para executar agregações. Dada a escolha de "armazenar essas informações como uma string que eu tenho que dividir" ou "armazenar em uma coluna" ... o vencedor quase sempre será "armazenar em uma coluna" para a maioria dos casos de uso em um RDBMS.

rfusca
fonte
Se for sempre o mesmo conjunto de 15 exames, é possível que seja mais rápido o processo de armazená-los desnormalizados (15 colunas). Uma pergunta, você propôs propositadamente um tipo de dados inteiro?
Edward Dortland
Além disso, a cada 15 exames de um aluno, você agora armazena 15 vezes uma ID de estudante e uma ID de teste extra.
Edward Dortland
11
mexer aqui - sqlfiddle.com/#!1/f7343/10
rfusca
6
@EdwardDortland sempre terá 15 anos até que não seja.
therefromhere
11
@ EdwardDortland: Os cálculos são bons. Agora, você pode executá-los para os índices de que precisa?
precisa saber é o seguinte
1

contanto que você use tiny int (0 a 255) usando um caractere (15) ou 15 tinyint é o mesmo (tamanho). Então, do ponto de vista do desempenho, escolha as 15 tinyints desde que economize na extração e no manuseio de strings.

ATUALIZAR

se as marcas tiverem dois dígitos, você precisará de CHAR (30) e isso é duas vezes o tamanho de 15 vezes um centímetro.

Edward Dortland
fonte
9
Dado esse design extremamente simples, se houver uma instituição neste planeta que possua alunos suficientes em 15 exames (com notas) para causar problemas de desempenho em um RDBMS moderno, vou chorar até dormir esta noite.
Philᵀᴹ
11
Se as marcas tiverem dois dígitos? Mas tiny int cobre pontuações de 0 a 255 ou -127 a 127, dependendo de como você prefere contar. Portanto, como as pontuações raramente são negativas, isso dá mais de 250 pontos em um exame e a maioria dos exames é pontuada em uma escala de 0 a 100%. Eu acho que tinyint é absolutamente útil aqui.
jcolebrand
Sim, concordamos, eu era simples afirmando que, com marcas de dois dígitos em vez de marcas de um dígito, fica ainda pior armazená-lo como char. Desde então, você precisaria de char (30) em vez de char (15). Embora com dois dígitos ou não, 15 minúsculas ints sempre terão apenas 15 bytes.
Edward Dortland
-1 porque esta resposta recomenda os campos por design de linha que é muito inferior ao armazenamento de cada resultado de exame em sua própria linha como proposto pelas outras mensagens
miracle173