Pode ser uma boa ideia criar uma nova tabela para cada cliente de um aplicativo da web?

10

Isso é semi-hipotético e, como não tenho experiência em lidar com tabelas de banco de dados massivas, não faço ideia se isso é horrível por algum motivo. Para a situação:

Imagine um aplicativo baseado na Web - digamos, software de contabilidade - que possui 20.000 clientes e cada cliente possui mais de 1000 entradas em uma tabela. São 20 milhões de linhas que eu sei que certamente podem retardar consultas complexas.

Em um caso como esse, faz mais sentido criar uma nova tabela no banco de dados para cada cliente? Como os bancos de dados reagem a ter tabelas de 20k (ou mais!)?

Vai
fonte

Respostas:

15

De um modo geral, não, não faz sentido ter uma tabela (acho que você realmente quer dizer banco de dados aqui) por cliente. 20 milhões de linhas são relativamente pequenas para uma tabela de banco de dados. A velocidade da consulta nesse caso não deve ser um problema, desde que o banco de dados esteja ajustado corretamente (indexado) e as consultas sejam reunidas corretamente. Qualquer que seja o benefício que você acha que obteria separá-los, seria compensado pela complexidade adicional de gerenciar 20.000 bancos de dados individuais. Por exemplo, o que acontece quando você deseja alterar a estrutura da tabela? Agora você tem que fazer isso 20.000 vezes!

Pior ainda, se você achar que o tamanho do banco de dados está se tornando um problema, sempre poderá dividi-los em bancos de dados separados posteriormente.

GrandmasterB
fonte
não, eu literalmente quis dizer tabelas dentro do banco de dados. Não consigo imaginar um motivo para criar um banco de dados por cliente. E se 20 milhões de linhas são pequenas, qual é o tamanho? E o que você faz nesse momento?
Will
11
@ ChrisF, exatamente - há muitos casos em que a tecnologia ou o modelo de negócios exigem DBs separados por cliente. Mas não consigo pensar em um motivo para tabelas separadas no mesmo banco de dados.
GrandmasterB
11
@GrandmasterB - Acho que @Will está fazendo a pergunta errada.
ChrisF
11
@ Will: Se possível, vá a uma reunião do Oracle User Group ou o equivalente a algum outro banco de dados sofisticado. Você verá que suas idéias de "pequeno" e "grande" precisam de muito reajuste. Isso aconteceu comigo. Dica: se ele se encaixa em um disco, não é grande para os padrões do DBA.
precisa
11
@Gorton, o InnoDB é geralmente considerado melhor por confiabilidade e concordância, e o MyISAM por velocidade. Portanto, você realmente precisa avaliar os diferentes mecanismos de armazenamento com base no uso esperado do banco de dados do seu aplicativo específico.
GrandmasterB
5

Parece uma má ideia.

Não tente enganar o banco de dados com construções exóticas como essa. Os mecanismos de banco de dados são projetados com muitas otimizações para lidar com grandes conjuntos de dados. Por exemplo, o que você está descrevendo parece muito próximo de uma tentativa de implementar índices manualmente. Basta usar índices fornecidos pelo DB Engine, eles são implementados muito melhor do que você provavelmente conseguirá fazer por conta própria e não exigirá tanta manutenção.

Além disso, como regra geral. Sugiro não arquitetar um banco de dados de uma maneira que exija manipulação ou criação de estruturas de banco de dados (tabelas, campos) durante o uso normal do aplicativo. Isso torna a otimização do desempenho um problema e muitas vezes obriga a conceder muitas permissões aos usuários para realizar tarefas rotineiras, potencialmente criando brechas na segurança.

JohnFx
fonte
Eu votaria uma vez para cada um dos seus dois parágrafos, se permitido.
David Thornley
3

Aqui está um artigo que eu sempre aconselho as pessoas a lerem quando fazem esta pergunta:

http://datacharmer.blogspot.com/2009/03/normalization-and-smoking.html

Mchl
fonte
Eu não tinha idéia de que um banco de dados cria um arquivo real por tabela = x
será
11
Isso pode depender do RDBMS real usado. O MySQL faz isso (até três arquivos por tabela, se você usar o MyISAM). Outros podem não.
Mchl
A versão corporativa do SQL Server fará isso se você projetar dessa maneira, mas não automaticamente.
JeffO
A Oracle definitivamente não faz isso.
user281377
A Oracle pode fazê-lo, da mesma maneira que o SQL Server pode fazê-lo, mas eu não posso imaginar por que você jamais projetar seu esquema para ter um arquivo por tabela. Dividir um banco de dados em vários arquivos faz sentido, mas não um arquivo por tabela.
Dean Harding
1

IMHO uma única tabela não deve ser um problema, por isso não crie um problema em que ainda não exista. Há muito o que você pode fazer para ajudar no desempenho. Você pode particionar uma única tabela em vários arquivos com base no ID do cliente ou em um campo de data para ajudar no IO. Seu banco de dados não precisa acompanhar, otimizar e armazenar em cache 20.000 instruções sql diferentes para todas as consultas necessárias no site. Você pode indexar por clientid. Os clientes de 20K podem pagar por muito hardware.

Para esse tipo de tabela, um dB do tipo NoSQL pode ser usado.

Com clientes de 20 mil, o banco de dados pode não ser o seu elo mais fraco; então, por que introduzir tanta complexidade?

JeffO
fonte
`Você pode particionar uma única tabela em vários arquivos com base no ID do cliente ou em um campo de data para ajudar no IO.` - não sei o que você quer dizer com isso. Algum esclarecimento?
Will
Vários arquivos no sistema operacional. Um servidor pode fazer mais leituras / gravações em muitos arquivos, em vez de apenas um.
Jeffo
Acho que quis dizer: nunca ouvi falar de uma coisa dessas, onde encontro mais informações sobre isso? :-) Mas eu vou entrar em contato com o google ~
Será
msdn.microsoft.com/en-us/library/ms345146(v=sql.90).aspx Você pode encontrar problemas de desempenho de backup se os índices estiverem em arquivos separados das tabelas que eles indexam (ou talvez em unidades?).
JeffO
0

Essa é uma péssima abordagem.

Particione a tabela verticalmente, 2 servidores de banco de dados, um para IDs de usuário ímpares e outro para par, deve funcionar bem (os dados não estão relacionados entre os usuários).

Classifique os dados por user_id e, se isso não for possível, obtenha uma enorme quantidade de discos RAM ou SSD.

Slawek
fonte