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!

Foi útil?

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.

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