Pergunta

Actualmente tenho 26 tabelas em um banco de dados MYSQL. Meu chefe quer que eu recriar esses 26 mesas sempre que temos um novo cliente, e anexar uma abreviatura cliente de algum tipo para essas novas tabelas. Assim, por exemplo, há company1 ~ sistema ~ usuários e company2 ~ sistema ~ usuários e assim por diante e assim por diante.

Eu prefiro basta adicionar uma tabela para o banco de dados que mantém o controle de nossos clientes, com um auto incremento de 11 dígitos INT chave primária e referenciá-lo nos outros 26 mesas em vez disso, por isso não estamos bagunçando o banco de dados com 4000 tabelas se ter 200 clientes.

Eu acho que o seu medo é que se formos o método que eu prefiro fazer, levará MYSQL visivelmente mais tempo para realizar consultas porque os clientes com qualquer lugar entre 2000 e 5000 registros de cada um vai estar compartilhando tabelas. Assim, por exemplo, procurando por usuários que pertencem a company1 a partir de uma tabela chamada sistema ~ usuários com 1.500.000 registros seria mais lento do que em busca de usuários a partir de uma tabela chamada company1 ~ sistema ~ usuários com 2.000 registros. Eu acho que seria realmente ser mais lento para MYSQL para procurar se cada cliente, temos tem 26 conjuntos de mesas (que é 26 por cliente).

Qual o método é realmente mais lento?

Foi útil?

Solução

Porque não basta criar um banco de dados ou cada empresa? E então você não precisa mesmo de construir nomes de tabelas dinâmicas ao construir suas consultas. É uma solução muito mais som. Além do mais, ele vai fazer os dados do cliente mais separados de modo que qualquer inter-dependência provavelmente será mais óbvio.

As obras acima melhores quando as camadas de aplicação também são separados para que você possa fornecer a cada instância com um conjunto diferente de credenciais de login do banco de dados.

Se isso não for o caso, pode funcionar bem ou ser desagradável ou multa, dependendo da sua instalação, que plataforma você está usando e assim por diante.

Adição de um nome da empresa é um hack, mas ele pode ser feito para trabalhar, eu acho.

Ter um ID do cliente em registros também é uma abordagem comum. Eu não necessariamente se preocupar cerca de 1,5 milhões de registros de um ponto de vista do desempenho, desde que as tabelas são apropriados indexada. Esta não é uma enorme quantidade de registros. Além disso, os critérios de identificação da empresa devem limitar os resultados razoavelmente bem de qualquer maneira.

Outras dicas

200 clientes * 5.000 registros [em qualquer determinada tabela] é pequeno para os padrões de banco de dados. Desde que você adicionar o cliente-id como a primeira chave da maioria dos índices, o esquema que você sugere não deve provocar qualquer degradação de desempenho notável.

No entanto, pode ser interessante para manter os dados dos clientes separados por outras razões. Talvez se isso faz sentido no que diz respeito à aplicação, você pode lidar com dados de cada cliente diferente em um banco de dados separado.

Se você tiver índices apropriados no identificador de empresa, o desempenho não deve ser um problema.

Como para acrescentar um id para os nomes de tabela, por que não considerar a criação de uma instância de banco de dados separado em vez disso? Eu acho que mudando os nomes de tabela pode exigir adicional de codificação (para gerar dinamicamente os nomes de tabela em qualquer consulta), onde o uso de diferentes instâncias parece simples.

Mantenha os dados de todos os seus clientes no mesmo conjunto de tabelas até que você tenha uma boa razão para fazê-lo.

Pelo que eu entendo a partir do acima, seus dados são incrivelmente minúsculo, portanto, vai caber na memória RAM; isso faz com que o ajuste de desempenho desnecessária na prática, para que você não se preocupam com coisas como índice de agrupamento.

Faça a coisa mais simples que poderia funcionar. Apenas mantê-los em um conjunto de tabelas.

Obrigado a todos por suas sugestões maravilhosas e úteis. Desde o consenso geral entre você parece que eu deveria quer separar cada cliente conjunto de tabelas em seu próprio banco de dados ou permitir que os clientes para compartilhar suas informações em um conjunto de tabelas com índices apropriados com identificadores empresa.

Você está solução soa melhor e, tanto quanto o desempenho vai, hardware é barato. Tentando manter a 4000 tabelas ou 26 bases de dados, é provável custar mais do que o sucesso de uma vez de uma CPU mais agradável com mais memória RAM. Parece que seu chefe está tentando fazer a engenharia para você, isso não é bom.

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