Após esse comentário em uma das minhas perguntas, estou pensando se é melhor usar um banco de dados com esquemas X ou vice-versa.
Minha situação: estou desenvolvendo um aplicativo da Web onde, quando as pessoas se registram, eu crio (na verdade) um banco de dados (não, não é uma rede social: todos devem ter acesso aos seus próprios dados e nunca ver os dados do outro usuário) .
Foi assim que usei a versão anterior do meu aplicativo (que ainda está em execução no MySQL): através da API do Plesk, para cada registro, faço:
- Crie um usuário de banco de dados com privilégios limitados;
- Crie um banco de dados que possa ser acessado apenas pelo usuário criado anterior e pelo superusuário (para manutenção)
- Preencher o banco de dados
Agora, precisarei fazer o mesmo com o PostgreSQL (o projeto está ficando maduro e o MySQL ... não atende a todas as necessidades).
Eu preciso ter todos os backups de bancos de dados / esquemas independentes: pg_dump funciona perfeitamente nos dois sentidos e o mesmo para os usuários que podem ser configurados para acessar apenas um esquema ou um banco de dados.
Então, supondo que você seja um usuário mais experiente do PostgreSQL do que eu, qual você acha que é a melhor solução para a minha situação e por quê?
Haverá diferenças de desempenho usando o banco de dados $ x em vez de esquemas $ x? E que solução será melhor manter no futuro (confiabilidade)?
Todos os meus bancos de dados / esquemas sempre terão a mesma estrutura!
Para a questão dos backups (usando pg_dump), talvez seja melhor usar um banco de dados e vários esquemas, despejar todos os esquemas de uma vez: a recuperação será muito simples, carregando o despejo principal em uma máquina de desenvolvimento e despeje e restaure apenas o esquema necessário: é uma etapa adicional, mas despejar todo o esquema parece mais rápido do que despejá-los um por um.
ATUALIZAÇÃO 2012
Bem, a estrutura e o design do aplicativo mudaram muito nos últimos dois anos. Ainda estou usando a one db with many schemas
abordagem, mas ainda tenho um banco de dados para cada versão do meu aplicativo:
Db myapp_01
\_ my_customer_foo_schema
\_ my_customer_bar_schema
Db myapp_02
\_ my_customer_foo_schema
\_ my_customer_bar_schema
Para backups, estou descartando cada banco de dados regularmente e depois movendo os backups no servidor de desenvolvimento.
Também estou usando o backup PITR / WAL, mas, como eu disse antes, não é provável que precise restaurar todo o banco de dados de uma vez ... então provavelmente será descartado este ano (na minha situação não é a melhor abordagem )
A abordagem one-db-many-schema funcionou muito bem para mim desde agora, mesmo que a estrutura do aplicativo seja totalmente alterada:
Eu quase esqueci: todos os meus bancos de dados / esquemas sempre terão a mesma estrutura!
... agora, todo esquema tem sua própria estrutura que muda dinamicamente, reagindo ao fluxo de dados dos usuários.