Sou principalmente um desenvolvedor de aplicativos, mas tenho que fazer todo o trabalho de banco de dados inicial para meu projeto atual ( aliás ... é MS SQL Server 2008 ). Como primeira decisão, estou tentando descobrir se devo dividir meu estado usando bancos de dados separados ou esquemas separados no mesmo banco de dados. Eu fiz uma pequena leitura no esquema do SQL Server e parece uma maneira natural de separar domínios de objeto ( que eu gosto ), mas não tenho certeza se pode haver custos ocultos para esse padrão.
Quais são as coisas mais práticas que devo considerar ao selecionar entre essas duas abordagens? Se eu evitar o dbo.mytable
favor de myschema.mytable
estarei criando outros desafios ( ou problemas ) para minha arquitetura?
Como uma observação lateral... Em algum momento, isso será entregue a um DBA real para manter/suportar, então estou tentando ter certeza de não tornar a vida deles mais difícil.
Começarei dizendo para não considerar esquemas como namespaces ou domínios de objetos no sentido OO. Os esquemas são essencialmente contêineres de permissão com algum valor agregado (veja abaixo)
Além disso, "esquemas separados" ou "bancos de dados separados" são dois conceitos diferentes. Os dados que precisam ser transacionalmente e referencialmente consistentes precisam estar no mesmo banco de dados. Veja um banco de dados ou dez? artigo do blog para mais.
Nesse banco de dados, você pode ou não usar esquemas para organizar seus objetos.
Pessoalmente, sou fã de esquemas e sempre os uso, mas para coisas como permissões e agrupamento lógico. Para isso, remeto-vos às questões anteriores onde podem ver que a opinião geral é favorável às mesmas:
Para o caso de bancos de dados separados, consulte a resposta de Aaron , mas tudo isso depende do requisito "transacionalmente e referencialmente consistente".
Concordo com @gbn. Arquitetei soluções usando esquemas para separação e bancos de dados para separação e acho que usar bancos de dados é muito mais prático. Algumas razões:
<schema>
na frente de todas as referências de objeto. Isso se presta a muito SQL dinâmico, muitos logins de aplicativos diferentes com esquemas padrão (o que significa que seu código não usaria o prefixo do esquema, contando com o esquema padrão do usuário do aplicativo - pode levar a um enorme inchaço do cache do plano e depuração difícil), ou muitos procedimentos armazenados para gerenciar (imagine apenas um relatório simples, se você precisar de um por esquema, o código muda, agora você precisa alterar o mesmo código várias vezes, uma vez para cada esquema).