Estou desenvolvendo um banco de dados que possui dados provenientes de vários aplicativos diferentes. Em minha primeira passagem no design, coloquei as tabelas de preparação cada uma em um esquema nomeado para seu aplicativo de origem.
Como vários aplicativos de origem têm dados e nomes de tabela semelhantes, uso o nome do esquema para diferenciar o aplicativo de origem. A alternativa que estou considerando seria usar um único esquema e incluir o aplicativo de origem no nome da tabela.
Eu queria examinar as regras de design relacionadas a quando usar um esquema diferente e os prós e contras de fazê-lo e não consegui encontrar nada.
O esquema é puramente para permissão e segurança?
Faz sentido, do ponto de vista organizacional, criar objetos em esquemas separados além do necessário para o desenvolvimento de aplicativos ou isso apenas adiciona complexidade desnecessária às consultas?
Existem outras repercussões desta decisão que eu deixei de considerar?
Vou mencionar o design lógico e físico aqui.
Eu sei que a IBM recomenda colocar tabelas temporárias em seu(s) próprio(s) esquema(s) e até mesmo em seus próprios espaços de tabela (implementação de banco de dados específica para DB2 neste caso) por motivos de gerenciamento. Os esquemas permitem que você gerencie melhor por meio da separação de interesses e segurança. Os tablespaces (design físico) permitem lidar melhor com questões de manutenção relacionadas a REORGs, RUNSTATS e backups.
Embora você não esteja implementando o IBM DB2, acho que a filosofia deles é algo que vale a pena pensar e implementar.
Pela descrição que você deu, não acho que a segurança seja a preocupação aqui. Como você disse, seu aplicativo recebe dados de várias fontes. A segurança vem/implementada quando você tem um tipo de segurança baseada em funções nos métodos de recuperação/acesso desses dados. Eu estou supondo que deve haver primeiro algum tipo de consolidação, análise, reconciliação etc ... acontecendo antes que os dados sejam apresentados ao usuário.
Nesses casos, o esquema separado é a melhor maneira de manter os dados de origem intactos, não apenas durante a preparação, mas até mesmo uma cópia original dos dados de origem; Apenas no caso de você querer solucionar problemas mais tarde quais dados foram recebidos de uma fonte específica.
Dependendo de quais são os provedores de dados, mas se forem dados financeiros, é muito provável que o provedor atualize o formato dos dados de origem, adicione/remova colunas etc. com frequência. se várias origens começarem a fazer isso ao mesmo tempo, será difícil gerenciar essas alterações se você tiver um design de esquema consolidado. mas se você tivesse um esquema separado, saberia que essas alterações não afetariam os dados de outras fontes.
Segundo cenário, se você espera que seu aplicativo como fonte forneça algum tipo de dados consolidados ou dados específicos de origem para outros subsistemas, então, com um esquema separado, você tem mais controle e flexibilidade em termos de como e o que deseja compartilhar. Se você tiver o mesmo esquema; o compartilhamento de dados se tornará difícil selecionando algumas tabelas, funções personalizadas ou escrevendo APIs alternativas.
O lado negativo de ter um esquema separado é que você precisa usar nomes de objeto totalmente qualificados para evitar resultados inesperados. Além disso, se você tiver algum cenário em que possa usar consultas abertas/distribuídas, servidores vinculados, etc... Lembre-se de que ele permite apenas dois níveis de resolução de nomes de objetos. Pense em outras coisas, como tarefas do agente SQL e outros recursos que você pode estar usando e verifique se ele oferece suporte à resolução de nome de objeto totalmente qualificada ou não.