MySQL / Rails Desempenho: uma tabela, muitas linhas vs. muitas mesas, menos linhas?
-
18-09-2019 - |
Pergunta
Na minha Rails App tenho vários modelos que lidam com ativos (anexos, imagens, logotipos, etc.). Estou usando attachment_fu e até agora eu tenho 3 tabelas diferentes para armazenar as informações no meu banco de dados MySQL.
Eu estou querendo saber se ele faz a diferença no desempenho se eu usasse STI e colocar todas as informações em apenas 1 mesa, usando uma coluna de tipo e com diferentes classes, herdadas. Seria mais DRY e mais fácil de manter, porque todos compartilham muitos atributos e características.
Mas o que é mais rápido? Muitas mesas e menos linhas por tabela ou apenas uma tabela com muitas linhas? Ou há nenhuma diferença em tudo? Eu vou ter que lidar com um monte de informações e muitas consultas por segundo.
Obrigado por sua opinião!
Solução
Muitas mesas e menos linhas é provavelmente mais rápido.
Não é por isso que você deve fazê-lo, no entanto: seu banco de dados deve modelar o seu problema de domínio. Uma mesa é um modelo pobre de muitos tipos de entidade. Então você vai acabar escrevendo lotes e lotes de código para encontrar o subconjunto de que a tabela que representa o tipo de entidade que está em causa atualmente com.
regular, aceitou, banco de dados limpo e código de cliente front-end não vai funcionar, por causa do seu one-tabela que-é-todo-coisa-e-não-coisa-em-tudo.
É mais lento, mais frágil, vai multiplicar o seu código em cima de você aplicativo, e faz um modelo pobre.
Faça isto única , se todas as coisas que têm exatamente os mesmos atributos e o mesmo (ou possivelmente Liskov substituíveis) significado semântico em seu domínio do problema.
Caso contrário, simplesmente não até mesmo tentar fazer isso.
Ou se você fizer isso, pergunte por que isso é melhor do que ter uma grande Mapa / tabela hash Array / associativa para manter todas as entidades em seu aplicativo (e lotes de funções, a maioria deles duplicared, cortar e colar, e fora de data, fazendo casos switch
ou RTTI para descobrir o tipo real de cada entidade).
Outras dicas
A única maneira de saber com certeza é tentar ambas as abordagens e medir o desempenho.
Em termos gerais, isso depende se você está fazendo junta-se através dessas tabelas e se você, como as tabelas são indexadas. De um modo geral, banco de dados se junta são caros que é por isso que os esquemas de banco de dados são por vezes denormalized para melhorar o desempenho. Isso não costuma acontecer até que você está lidando com uma séria quantidade de dados embora isto é, milhões de registros. Você provavelmente não tem esse problema ainda e talvez nunca será.
Se as linhas têm os mesmos atributos, então, sim, uma mesa é muito melhor, e apenas uma linha para especificar o tipo de dados, caso contrário, use differents tabelas de lidar, que melhor em desempenho, quantidade de código e mesmo no lisibility de código de cabeceira.