Dúvidas sobre um projeto de software
Á DEVMEDIA
Prezado(s) sou um desenvolvedor individual, tenho uma micro empresa de software, e possuo um software DESKTOP FOR WINDOWS de gestão administrativa e financeira para igrejas.
Hoje este software conta com cerca de 3.000 clientes. Boa parte destes clientes estão solicitando um software de gestão de igrejas totalmente WEB.
Bom, estou fazendo os cursos de formação .NET do portal de vocês, assim que terminar vou começar a desenvolver o projeto web para igrejas.
O software vai ser o mesmo para todos os clientes, porém com recursos de customização, como já existia no DESKTOP.
O banco de dados será o SQL SERVER 2008, se eu for usar o WINDOWS AZURE será o SQL AZURE.
Pretendo comercializar o software como um serviço web (SaaS) por assinatura mensal, onde os dados de todos os clientes irão ficar em um DATA CENTER contratado por minha empresa. Estou estudando WINDOWS AZURE.
A baixo relaciono algumas dúvidas que tenho sobre este projeto para a consultoria DEVMEDIA me responder:
Devo ter apenas um banco de dados para todos os clientes de um mesmo segmento (multi-inquilino), levando em conta a quantidade de clientes que existem hoje, cerca de 3.000 que possuem em média 3 usuários cada um e que teria aproximadamente 9.000 usuários em pouco tempo utilizando o software, isto é viável?
Exemplo: Todos os meus clientes de igrejas acessariam o software informando: (CÓDIGO DA ORGANIZAÇÃO, USUÁRIO, SENHA) neste caso todos os dados de todos os clientes ficam no mesmo banco de dados.
No caso do WINDOWS AZURE, utilizando o SQL AZURE como banco de dados, contratando apenas uma versão de 10GB, seria viável para um sistema multi-inquilino.
Vi um *artigo em um blog do Otávio arquiteto da Microsoft que ele fala de se ter um banco de dados para cada cliente, isto ficaria muito caro se tratando de um modelo de negócio que se baseia em micro pagamento. No caso eu entendi que eu teria que contratar para cada cliente um banco de 10G, é assim mesmo que funciona para o caso de querer ter os dados de cada cliente separado em um banco diferente?
Outros artigos sobre SaaS falam também sobre isto: “particionamento de dados em bancos multi-inquilino”, o que é isto na prática?
*SaaS (Privado/Público): imagine fazer um aplicativo para ser vendido para milhares ou mesmo milhões de clientes, cada um utilizando seus dados de forma exclusiva, tendo um máximo de 10G de banco SQL (limitação atual do SQL Azure), mas podendo guardar em Blobs e Tables do Azure um volume virtualmente infinito de documentos, fotos, vídeos, etc – o que diminui consideravelmente a limitação de volume máximo do banco. Imagine poder crescer/decrescer o número de clientes de acordo com a sazonalidade sem custo de compras ou ociosidade de recursos. Este é também um cenário para o Azure.
a) SaaS: um banco de dados para cada inquilino ou pequeno grupo de inquilino ;
Se um sistema multi-inquilino não é viável para o AZURE, qual seria a forma mais viável de se desenvolver este projeto?
Para este cenário de milhares de registros, as fotos de membros e outros cadastros devem ficar armazenados dentro do banco ou fora?
Se a resposta for dentro do banco, isto vale tanto para todos os dados dos meus clientes estarem no mesmo DB, como se cada cliente possuir seus dados em um DB individual?
Vi que no Azure você pode utilizar os blobs para armazenar fotos e vídeos, isto é viável e fácil de se manipular? Se eu entregar os dados para um cliente que quer encerrar um contrato, é fácil recuperar estas fotos e vídeos dos blobs para armazenar dentro de um banco de dados e entregar para o cliente.
QUAL MELHOR FERRAMENTA DE RELATÓRIOS PARA SISTEMAS WEB, CRYSTAL REPORTS, REPORTVIEW, REPORTING SERVICE?
Se eu optar pelo REPORTING SERVICE quais as implicações com relação a custos para esta cenário que já descrevi. Se utilizar o AZURE haverá algum custo?
Para o cenário que estou descrevendo, um DATA CENTER que forneça um servidor nas nuvens tipo LOCAWEB, eu é que tenho que possuir a licença do SQL SERVER 2008 e também do REPORTING SERVICE? Quantas licenças serão necessárias?
Neste caso onde os dados de meus clientes ficam hospedados em NAS NUVENS em um DATA CENTER exemplo o WINDOWS AZURE MICROSOFT, e este serviço é contratado pela minha empresa, como fica a questão de responsabilidade dos dados dos meus clientes, se acontecer um desastre onde todos os dados forem perdidos, eu sou o único responsável, terei que indenizar os clientes?
Eu utilizando o SQL SERVER 2008 contratado de uma LOCAWEB por exemplo, eu posso adicionar quantos registros quiser nas tabelas do banco de dados, que ele não irá estourar a capacidade de armazenamento, tornando assim um sistema viável para MULTI-INQUILINO?
Para este cenário que estou descrevendo, utilizando o DATA CENTER DA LOCAWEB eu precisarei apenas de uma instancia do SQL SERVER?
Para um cenário em que cada um dos meus clientes irão possuir um banco de dados individual, qual o limite de bancos conectados a uma instancia do SQL SERVER 2008 mais especificamente o SQL AZURE?
Como eu faço para a senha do banco não aparecer na string de conexão?
Vocês possuem um modelo de contrato entre cliente e fornecedor de software como serviço (SaaS), para que eu possa ter uma noção de como funciona em termos legais esta prestação de serviço.
Vou ter que criar no software um controle de genealogia de grupos pequenos, ou seja o sistema vai possuir um cadastro de grupos e estes grupos geram outros grupos e assim infinitamente, qual a melhor maneira para criar uma arvore genealógica e qual a melhor forma de exibir esta árvore genealógica em vídeo e em papel?
Para construir este meu projeto utilizando as melhores práticas, construindo em camadas, para acessar os dados eu sempre vou precisar de uma camada de serviços utilizando o WCF?
Aguardo o retorno de vocês!
Atenciosamente,
Jarminiane A. Batista
Visual Informática Ltda
www.visualinformatica.com.br
MSN: visual_informatica_01@hotmail.com
SKYPE: visual_informatica_software_01
(33) 3278-4610 / 4141-0585 / 9963-0805
Jarminiane Batista
Curtidas 0
Respostas
Luiz Maia
24/11/2009
Prezada Jarminiane,
Eu aconselho o uso de apenas um banco de dados, que que a massa de registros é pequena (10mil).
Quando ao Azure, ainda é um recurso novo e não tenho depoimentos de clientes para o mesmo, nem criticas nem elogios. Sugiro não usar este recurso. Contrate um bom HOST que tem todos os recursos instalados, framework, SQL, ReportWervice e etc... Sugiro o LocalWeb. Eles tem um suporte muito bom também.
Quando a gravação de Imagens em campos blob, isto depende de vc, se quiser economizar em espaço fisico em disco, serão muitas fotos e arquivo, grave no bancó.É simples demais e posso te mandar um exemplo futuramente.
Para relatorios, isto tb é um criterio de cada usuario, eu particularmente, prefiro o ReportService. Se sua massa de dados aumentar muito, faça um DW (data warehouse).
Quanto a quantidade de resgistro do Banco, isto é de responsabilidade do Host que ira contratar. Mas acho que tem planos ilimitados de tamanho de banco.
Não temos modelo de contrato de softwares.
Para a arvore genealogica, basta criar um campo filho como chave em sua tabela. Depois vc pode exibir isto num TreeView. Como assim exibir em Video e Papel?
Não necessariamente vc ira precisar de uma camada WCF, sugiro usar apenas 3 camadas, INterface, negocio e persistencia. É suficiente.
Aguardo seu retorno caso existam mais duvidas.
Abraços
Att
Luiz Maia
GOSTEI 0
Jarminiane Batista
24/11/2009
Prezado Luiz,
Acho que não expliquei bem a primeira pergunta:
O que eu quiz dizer é que de inicio já terei cerca de 3.000 clientes que em média tem 3 usuários cada, ou seja de inicio 9.000 pessoas vão utilizar o software. A quantidade de registro em média é de 50.000 registros por cliente e porderá crescer, ou seja 50.000 registros x 3.000 Clientes = 150.000.000 registros, so que este sistema vai continuar crescendo mais clientes irão contratar o sistema, por isto a minha dúvida sobre utilizar um banco apenas para todos os clientes, ou banco separado para cada cliente que contratar o serviço.
No caso de utilizar um banco para cada cliente, o que eu tenho que fazer para isto funcionar automaticamente, assim que um novo cliente assinar o serviço este banco ser criado e ao fazer o login a string de conexão ser direcionada para o banco deste cliente?
No caso do WINDOWS AZURE, utilizando o SQL AZURE como banco de dados, contratando apenas uma versão de 10GB, seria viável para um sistema multi-inquilino com a quantidade de registros descrita acima e sempre crescendo?
DUAS NOVAS DÚVIDA SURGIRAM:
Vou utilizar o LINQ para realizar as consultas ao banco de dados, para uma base de dados com muitos registros e em constante crescimento eu devo sempre utilizar storad procedure ou posso usar consultas comum?
A quantidade de usuários que vão acessar minha aplicação, vão influenciar na velocidade de resposta desta aplicação no geral, o que deve fazer no caso do número de usuários aumentarem muito?
Outras perguntas não foram respondidas:
1 - Particionamento de dados em bancos multi-inquilino”, o que é isto na prática?
7 - No caso onde os dados de meus clientes ficam hospedados NAS NUVENS em um DATA CENTER que eu contratei, exemplo LOCAWEB ou WINDOWS AZURE MICROSOFT, como fica a questão de responsabilidade dos dados dos meus clientes, se acontecer um desastre no DATA CENTER onde todos os dados forem perdidos, eu sou o único responsável, terei que indenizar os clientes, serei indenizado também?
11 - Como eu faço para a senha do banco não aparecer na string de conexão?
13 - Você perguntou: "Como assim exibir em Video e Papel?" eu quero saber qual a melhor forma de visualizar a arvore genealogica no vídeo e você já respondeu TREEVIEW e na impressora que tipo de controle existe para imprimir uma arvore genealogica?
Me explica isto aqui melhor: "Para a arvore genealogica, basta criar um campo filho como chave em sua tabela. Depois vc pode exibir isto num TreeView"
14 - Em que situação eu tenho que usar o WCF, no caso de construir aplicações para o AZURE terei que acessar os dados atraves de uma camada de serviços utilizando o ADO DATA SERVICE?
Atenciosamente,
Sr. Jarminiane Alves Batista
GOSTEI 0
Luiz Maia
24/11/2009
Bom dia Sr. Jarminiane,
O SQL server 2005 tem capacidade de mais de 1 bilhão de registros, portanto, este não é o problema.
So tome cuidado ao construir suas querys, tente otimiza-las ao maximo, criar indices nas tabelas, usar views e stored procedures. Use a ferramenta de Analise de Custo de query do SQL ao construir sua query, assim não tera preblemas de performance.
No caso de mais de uma base, quando um novo cliente contratar o serviço, voce devera criar uma nova instancia do Banco de Dados, e criar a string de conexão dinamicamente.
Exemplo:
Vamos supor que sua string seja algo como:
data source=sql.meuserver.com.br;initial catalog=defaultdatabase;password=minhasenha;user id=meuser
Então, qdo for usar vc faria algo como:
string connectionString = ConfigurationManager.ConnectionStrings["APOLLOconnectionstring"].ConnectionString;
string database = Session["database"];
connectionString = connectionString .Replace("defaultdatabase", database);
SqlConnection conn = new SqlConnection(connectionString);
Caso deseje usar string de conexão criptografada, me avise que posto aqui o exemplo para você, ok?
Quanto ao uso de linq, sugiro não usar.
Pelo que percebi, seu sistema sera de complexidade media para grande, o Linq ira dificultar muito a construção de querys, a não ser que você use tudo em stored procedures, mas mesmo assim sugiro usar a Bilbioteca da Microsoft Applicaion Blocks, use a Enterprise Library 4.1, Não vai se arrepender!!!
Temos muito problemas com o Linq aqui mesmo no Suporte, sistemas que começam pequenos, ate ai sem problemas, mas na medida que vão ganhando robustes e complexidade, o pessoal esbarra um recursos limitados do Linq e em problemas de desenvolvimento mesmo.
Item 7:
É de responsabilidade dos Hosts o backup de informações e uso de Cluster para manter a aplicação online fulltime.
Item 11:
Pode criptografar a string de conexão no arquivo web.config. Para que eu possa te passar o exemplo, favor abrir outro post, ok?
Item 13:
No papel, certamente você terá que criar um relatorio usando um Report Viewr, e, com os itens expandidos, o impressora "vê" o que esta na tela, portanto, não vejo problema nisto. Pode criar tb sub relatorios dando a opção de impressao dos mesmos para o usuario.
Explicação de arvore genealogica:
Vc devera usar o Recurso de Recursividade do SQL: Veja exemplo de produtos e suas dependencias hierarquicas.
Modelo de dados
A estrutura de produtos é armazenada em duas tabelas, Produtos e HierProdutos. A primeira lista todos os produtos, com suas descrições físicas, e a segunda agrupa estes produtos em hierarquias.
Código 3 – Instrução DDL para criação das tabelas
CREATE DATABASE DbArtigo;
GO
USE DbArtigo;
CREATE TABLE HierProdutos (
IdHierarquia INT PRIMARY KEY,
IdHierarquiaPai INT CONSTRAINT fk_HierProdutos FOREIGN KEY REFERENCES HierProdutos (IdHierarquia),
Descricao VARCHAR(100)
)
CREATE TABLE Produtos (
IdProduto INT PRIMARY KEY,
IdHierarquia INT CONSTRAINT fk_Produtos_HierProdutos FOREIGN KEY REFERENCES HierProdutos (IdHierarquia),
CodProduto VARCHAR(100),
DescricaoProd VARCHAR(100)
)
As tabelas abaixo apresentam uma lista de hierarquias e produtos, para exemplificar o contexto de negócio. Nos itens seguintes, apresentam-se alguns problemas para o modelo de dados proposto.
Tabela 1 – Exemplo para a tabela de Produtos IdProduto IdHierarquia CodProduto DescProduto 1 9 P101 Processador 101 2 9 P102 Processador 102 3 10 P201 Processador 201 4 10 P202 Processador 202 5 17 P402 Processador 401 6 20 R001 Roteador 001 7 14 M001 Memória 1GB 8 8 M0012 Memória 512MB 9 8 M0013 Memória 512MB DDR2 Tabela 2 – Exemplo para a tabela Hierarquia de Produtos IdHierarquia IdHierarquiaPai Descricao 1 NULL Desktop 2 NULL Servidores 3 NULL Equipamentos de Rede 4 1 Placa-mãe 5 1 Placa de rede 6 1 Processador 7 1 Placa de Vídeo 8 1 Memória 9 6 Processador núcleo simples 10 6 Processador núcleo duplo 11 2 Placa-mãe 12 2 Placa de rede 13 2 Processador 14 2 Memória 15 13 Processador núcleo simples 16 13 Processador núcleo duplo 17 13 Processador de quatro núcleos 18 3 Roteador 19 3 Switch Deu para entender? Caso contrario, favor tb abrir outro chamado, assim poderemo tratar cada assunto com mais detalhes e mais eficácia. Item 14: o WCF é usado para sistemas distribuidos, do qual diferentes plataformas se comunicam através de web services. Agora, o uso deste recurso depende da cada finalidade de aplicação. Aguardo retorno. Abraços Att Luiz Maia
Tabela 1 – Exemplo para a tabela de Produtos IdProduto IdHierarquia CodProduto DescProduto 1 9 P101 Processador 101 2 9 P102 Processador 102 3 10 P201 Processador 201 4 10 P202 Processador 202 5 17 P402 Processador 401 6 20 R001 Roteador 001 7 14 M001 Memória 1GB 8 8 M0012 Memória 512MB 9 8 M0013 Memória 512MB DDR2 Tabela 2 – Exemplo para a tabela Hierarquia de Produtos IdHierarquia IdHierarquiaPai Descricao 1 NULL Desktop 2 NULL Servidores 3 NULL Equipamentos de Rede 4 1 Placa-mãe 5 1 Placa de rede 6 1 Processador 7 1 Placa de Vídeo 8 1 Memória 9 6 Processador núcleo simples 10 6 Processador núcleo duplo 11 2 Placa-mãe 12 2 Placa de rede 13 2 Processador 14 2 Memória 15 13 Processador núcleo simples 16 13 Processador núcleo duplo 17 13 Processador de quatro núcleos 18 3 Roteador 19 3 Switch Deu para entender? Caso contrario, favor tb abrir outro chamado, assim poderemo tratar cada assunto com mais detalhes e mais eficácia. Item 14: o WCF é usado para sistemas distribuidos, do qual diferentes plataformas se comunicam através de web services. Agora, o uso deste recurso depende da cada finalidade de aplicação. Aguardo retorno. Abraços Att Luiz Maia
GOSTEI 0
Jarminiane Batista
24/11/2009
Luiz, me envie o exemplo da string criptografada.
Você falou de usar Interprise Library 4.1 para acesso a dados, neste caso na hora das consultas que recursos vou usar, será consultas SQL ou LINQ, pode me dar um exemplo no caso de uma consulta ao banco de dados?
Quando se usa a INTERPRISE LIBRARY ela trata de TRANSAÇÕES (commit, rollback) e também de CONCORRÊNCIA entre usuários automaticamente, me mande um exemplo dos dois casos?
GOSTEI 0
Devmedia
24/11/2009
Senhor,
assuntos diferentes devem ser tratados em chamados diferentes. Para outras dúvidas por favor, abra um novo chamado.
Precisamos que especifique qual dúvida deseja tratar nesse chamado.
assuntos diferentes devem ser tratados em chamados diferentes. Para outras dúvidas por favor, abra um novo chamado.
Precisamos que especifique qual dúvida deseja tratar nesse chamado.
GOSTEI 0
Luiz Maia
24/11/2009
Segue o exemplo de criptografia de querystring:
Como no arquivo Web.Config nós guardamos dados confidenciais, como por exemplo a senha do banco de dados, convém criptografar (tornar incompreensível) estas informações para que pessoas não autorizadas, tenha acesso. E este é o objetivo deste artigo, explicar como criptografar a string de conexão no arquivo Web.Conifg (Figura 1).
Figura 1 – Arquivo Web.Config.
Nosso primeiro passo é saber em qual pasta nós criamos nosso projeto ASP.NET, no exemplo eu estou utilizando o seguinte diretório “F:\My Documents\Visual Studio 2005\WebSites\Criptografia” (Figura 2).
Figura 2 – Pasta do projeto ASP.NET contendo o arquivo Web.Config.
Por questões de praticidade não exibirei neste artigo o conteúdo do meu projeto, pois este não é o objetivo do artigo, e a única informação importante é que o projeto contém um arquivo com uma informação (senha do banco de dados) que precisamos tornar ela incompreensível para pessoas não autorizadas.
2. O segundo passo é abrir o SDK Command Prompt do Framework 2.0 (Figura 3).
Figura 3 – SDK Command Prompt – Iniciar / Programas / Microsoft .NER Framework SDK 2.0
3. Com o SDK Command Prompt aberto (Figura 4), nós podemos através do comando aspnet_regiis.exe ler todas as opções de criptografia existentes como, por exemplo, o modo de criptografar o Web.Config no IIS é diferente do modo pasta, que é o que estamos fazendo neste artigo.
Figura 4 – aspneti_regiis.exe 4. O quarto passo é executar o comando que irá realizar criptografia do Web.Config. aspnet_regiis.exe -pef "connectionStrings" "F:\My Documents\Visual Studio 2005\WebSites\Criptografia" –prov "DataProtectionConfigurationProvider" Listagem 1 – Comando aspnet_regiis.exe Vamos analisar o comando (Listagem 1). comando –pef :
-pef section web-app-physical-dir
Criptografa a sessão <connectionString> Em seguida informamos o endereço físico do projeto. A sessão que contém o a string de Conexão. <connectionStrings> <add name="cnnString" connectionString="Data Source=MANS;Initial Catalog=Formulas;User ID=sa; Password=1010" providerName="System.Data.SqlClient" /> </connectionStrings> Listagem 2 – Sessão <connectionStrings> O –prov é o provider que iremos utilizar, temos dois providers disponíveis. O DataProtectionConfigurationProvider usa DPAPI e o RSAProtectedConfigurationProvider usa a criptografia de chave pública do RSA. Repare que na (Figura 1) eu tenho uma outra sessão chamada <appSettings> que também poderia ser criptografada. 5. Após o comando ser digitado pode ver a resposta de sucesso da criptografia. (Figura 5). Figura 5 – Sucesso do comando. 6 . Com isso podemos voltar para Visual Studio e visualizar a string de conexão criptografada, mas antes de visualizar o Web.Config será exibida uma mensagem informando que o arquivo foi modificado e se deseja carregar estas modificações (Figura 6), clique em Sim.
Figura 6 – Aviso de modificação no arquivo Web.Config. 7. Em seguida, finalmente, podemos visualizar a string de conexão criptografada. (Figura 7). Figura 7 – String de conexão criptografada. Fonte: Artigo do Fabio Galante da DevMEdia Abraços Att Luiz Maia
Figura 4 – aspneti_regiis.exe 4. O quarto passo é executar o comando que irá realizar criptografia do Web.Config. aspnet_regiis.exe -pef "connectionStrings" "F:\My Documents\Visual Studio 2005\WebSites\Criptografia" –prov "DataProtectionConfigurationProvider" Listagem 1 – Comando aspnet_regiis.exe Vamos analisar o comando (Listagem 1). comando –pef :
-pef section web-app-physical-dir
Criptografa a sessão <connectionString> Em seguida informamos o endereço físico do projeto. A sessão que contém o a string de Conexão. <connectionStrings> <add name="cnnString" connectionString="Data Source=MANS;Initial Catalog=Formulas;User ID=sa; Password=1010" providerName="System.Data.SqlClient" /> </connectionStrings> Listagem 2 – Sessão <connectionStrings> O –prov é o provider que iremos utilizar, temos dois providers disponíveis. O DataProtectionConfigurationProvider usa DPAPI e o RSAProtectedConfigurationProvider usa a criptografia de chave pública do RSA. Repare que na (Figura 1) eu tenho uma outra sessão chamada <appSettings> que também poderia ser criptografada. 5. Após o comando ser digitado pode ver a resposta de sucesso da criptografia. (Figura 5). Figura 5 – Sucesso do comando. 6 . Com isso podemos voltar para Visual Studio e visualizar a string de conexão criptografada, mas antes de visualizar o Web.Config será exibida uma mensagem informando que o arquivo foi modificado e se deseja carregar estas modificações (Figura 6), clique em Sim.
Figura 6 – Aviso de modificação no arquivo Web.Config. 7. Em seguida, finalmente, podemos visualizar a string de conexão criptografada. (Figura 7). Figura 7 – String de conexão criptografada. Fonte: Artigo do Fabio Galante da DevMEdia Abraços Att Luiz Maia
GOSTEI 0
Jarminiane Batista
24/11/2009
Obrigado pela ajuda, pode encerrar o chamado.
Abraços,
Jarminiane A. Batista (Jardim)
GOSTEI 0