Ir ao conteúdo

Posts recomendados

Postado

Hoje temos 3 situações para desenvolvimento de  multi aplicações, as quais têm finalidade de prover uma aplicação que pode ser utilizada para N clientes(usuarios) diferentes.

- 1ª situação: Uma Aplicação e vários Banco de Dados. (Reaproveita a mesma aplicação);

- 2ª situação: Várias Aplicações e um Banco de Dados. (Duplica-se a aplicação para cada cliente e mantem os dados de todos num mesmo banco);

- 3ª situação: Várias Aplicações e vários Banco de Dados. (Duplica-se a aplicação e base de dados a cada cliente novo);

 

Cada uma delas possuem seus prós e contras. Hoje quero migrar meu sistema, que encontra-se na situação 3, para a situação 1, onde eu poderei reaproveitar a mesma aplicação (reduzindo manutenção) e duplicando a base de dados (separadamente) para cada novo cliente. Hoje estou utilizando a linguagem PHP e o framework Laravel 5.1, porém não consigo ver uma boa maneira no quesito performance, já cada cliente terá sua base de dados e com isso cada um terá uma user e pass diferente para acesso à base dele. Desta forma, creio que centralizar estes dados de user e pass numa base "master" seria a melhor opção, uma vez que terei q realizar uma conexão a esta base master para pegar as credenciais da base de dados do respectivo cliente para assim pode conecta-la e realizar as consultas, seria muito custoso.

 

O que sugerem para isso (tendo em vista também o framework Laravel, ou não rsrs)?

  • Moderador
Postado

@eric123 Acredito que esse tipo de solução só seria melhor se por acaso fosse um host.. que oferecesse um espaço e um cpanel... por exemplo.

Por que nesse caso cada usuário tem um ou mais banco de dados.. aí o nome do banco de dados é gerado a partir do nome dele de usuario.

 

se for o caso...  bem é isso mesmo que tem que fazer.. um banco que controla os acessos ( todas as aplicações)  e um banco específico só para o usuário com os dados da aplicação dele.

 

Se não for o caso..  eu acredito que seja melhor ter apenas um banco de dados.. e aí você implementar um  meio de identificação de registros de cada informação para que não haja problemas.

 

Leve em conta que se cada usuário tiver um banco de dados..  poderia haver uma perda de desempenho por tantas requisições em bancos diferentes... 

 

Postado

@dif Possuo um host sim. A ideia de centralizar os bancos em um só, neste caso, nao é nada interessante, uma vez que os dados são extremamente confidenciais acredito ser mais seguro separa-los em base de dados diferentes, cada um com seu acesso restrito.

Outra questão é a conexão em base de dados diferentes a todo momento, se tratando de um servidor não acredito que isso seja um problema, já que toda vez que é feita uma consulta é aberta uma conexão e a mesma é fechada ao final da consulta, isso independente da base de dados.

  • Curtir 1
  • Moderador
Postado

Sim. Nesse caso como é um host.. podes sem problemas usar um banco de dados para credenciais e outro banco de dados para cada usuário!

Com isso podes até criar um painel de controle administrativo para controlar o acesso do usuários por exemplo "bloquear" a conta dele.. até que ele faça algo.. ou infração de regras e etc... 

Uma outra coisa que eu vi uma vez, mas não sei se é muito usada.. é criptografar os dados e informações..   teve uns que falou sobre usar o md5 outros já defendiam a ideia de usar aes encrypt ou qualquer outra criptografia de duas vias.

 

Particularmente eu acho acho meio estranho criptografar todo o conteúdo.. e unificar num só. 

 

Sugestão: crie um db administrativo separado...

 

Postado

Isso!! Agora chegamos no mesmo raciocínio. A ideia é sim criar um painel administrativo para gerenciar estes conteúdos e usuários, isso é tranquilo.

Agora, outro ponto é como eu poderia organizar as credenciais de cada usuário, uma vez que irei identificar qual usuário(cliente) está acessando o seu sistema via rota, mais ou menos assim: www.sistema.com.br/nomeusuario. Como uso Laravel, ele possui um sistema de rota, num termo mais técnica o fonte da rota seria escrita assim:

Route::get('/{nomeusuario}','PrincipalController@Index');

E é a partir daí que fica a interrogação da melhor forma de organizar isto, pois  aquela ideia do banco de dados administrativo (principal) tenho vontade de criar uma tabela para armazenar as credenciais de cada usuário, onde seria selecionada os dados de acesso da base de dados do respectivo usuário, para que em seguida seja feita a conexão ao banco do usuário. Mas o problema disto está exatamente na questão de estar indo a base principal para verificar e buscar as credenciais do usuário toda vez que uma página for atualizada, uma vez q estes dados estão presente somente na base principal. Consegue entender o que eu disse?

 

Segue passo a passo para que sistema identifique qual usuário(cliente) é:

1º Usuario acessa o endereço: www.sistema.com.br/nomeusuario
2º Sistema pega o parâmetro passado e faz uma consulta na base principal (administrativa)

3º Base de dados principal retorna as credenciais do respectivo usuário(cliente)

4º Sistema já possui as credenciais e já pode realizar as consultas para retornar os dados a uma view (por exemplo)

 

Lembrando que isso será feito toda vez que uma URL for carregada, a não ser que possamos tentar guardar isso em cache, porém é arriscado e complicado de manipular.

  • Moderador
Postado

@eric123 A Questão do Laravel, não posso te ajudar pois não uso.

Mas posso dizer que podes fazer chamas a diversos bancos de dados ao mesmo tempo...

 

Por exemplo  Como terá as credenciais num banco, e outro só contendo os dados e informações dele...  podes por exemplo colocar o nome do banco dele na sessão( logo quando ele logar pelas credenciais do banco administrativo...

e usar para fazer as requisições somente aquele banco determinado.

 

Obviamente para isso, é necessário que ao criar a "conta" crie o banco de dados dele e armazenar este nome do db  no banco administrativo na sessão... aí o sistema identifica que o  cliente ID = 20 possui o banco dedados ID = 5 por exemplo..aí sempre que o usuário ID 20 estiver logado... você inicia uma consulta no banco de dados de acordo com o usuário..  

 

Para ficar mais claro a modelagem do banco ficaria aproximadamente assim:

 

DB-admin
  |-clientes
  |    |-ID auto increment(PK)
  |    |-Nome
  |    |-email(login)
  |    |-senha
  |    |-ID-banco(FK)
  |
  |-DB-clientes
  |    |-ID auto increment(PK)
  |    |-Nome-DB
  | 
  |-atividades
  |     |-ID auto increment (PK)
  |     |-ID-cliente(FK)
  |     |-DATETIME(o tipo datetime dá a data e hora juntos)
  |     |-ID-atividades(FK)
  |     |-IP(bom registrar o ip para evitar problemas e fraudes) 
  |
  |-Tipo-atividades
        |-ID auto increment (PK)
        |-Nome da atividade(Logou, saiu, deletou.. etc)
   

O banco administrativo seria basicamente isso Então quanto o usuário cliente logar, ele terá na sessão o nome do banco dele, e aí jogar numa variável o nome do banco contido na sessão... assim podendo utilizar ele na abertura de uma conexão.. por exemplo

Partindo do pressuposto que o cliente já logou no sistema...

 

<?php
   $nomeBancoCliente = $_SESSION_['nomeDB'];

   $conn = mysqli_connect("localhost","usuario","senha", $nomeBancoCliente);

Veja que foi criada uma conexão usando o nome do banco de dados que estava gravado no banco ,,, e inserido na sessão.

O lance é por aí... só precisas adaptar para seu framework Laravel.

Postado

@dif Entendi o q você quis dizer. porém neste caso eu terei situações (URLs) específicas para usuários não autenticados, que também necessitaram buscar dados da base de dados do cliente (como dados da empresa, por exemplo).

 

Acha que haverá algum empecilho nisto?

  • Moderador
Postado

@eric123 Empecilho não vai ter.. mas  vai ter que fazer o seguinte... os usuários não autenticados, fariam uma busca de dados.. na base de dados do cliente X.. e outros no Y...  nesse caso eu acho mais conveniente por exemplo permitir que esse usuário não identificado escolha o usuário autenticado para usar o banco dele como consulta..

 

Inicialmente você faz uma varredura na tabela do nome dos bancos dos clientes e pega o nome do banco... com isso podes colocar o nome do banco num elemento select(só um exemplo)

 

assim você pode informar ao sistema em qual banco de dados se conectar e buscar a tal informação...

Você tem N maneiras de resolver essa parte.. esta é uma delas!

 

Para melhor compreender o que estou dizendo.. seria algo assim:

Sou um usuário externo.. nem acesso de login tenho... mas preciso buscar o nome das empresas que trabalham com o cliente X

Então.. eu entro numa página chamada  busca.php 

Aí lá vai conter:

 

  • Um campo para escrever o que quer procurar
  • um campo select com o nome do cliente( no caso o value seria o nome do banco dele)
  • outros filtros de busca se quiser..

 

Aí esse formulário chama um arquivo processaDados.php por exemplo que recebe os dados do formulário...

 

e aí tu cria a conexão de acordo com o campo select selecionado(usado só para indicar em qual base da dados vai pesquisar)...

 

Claro que se quiser por exemplo fazer uma pesquisa de uma coisa em todos os bancos existentes.. aí a coisa complica.. porque terias que fazer uma instrução SQL imensa... combinando com o php( usando os loop.. while.. for.. provavelmente.. seria um caminho mais longo do que simplesmente informar onde exatamente vais procurar)

 

Bem o caminho é por aí... só tens que adaptar a ideia para seu projeto.

Postado

Entendi...

O problema é que toda vez será assim né, o usuario terá q selecionar a base de dados. Teoricamente pra um usuário fica desnecessário.

Bom, mas de qualquer forma você me abriu bem a mente, deu pra ter bastantes ideias com suas sugestões! Vou tentar implementa-las!

 

Agradeço desde já!

  • Moderador
Postado

@eric123 Como mencionado, até daria para fazer sem ter que "selecionar" a onde exatamente qual banco vai procurar.. só  que aí terias que percorrer toda a tabela do nome dos bancos de dados,  e abrir uma conexão com cada um deles.. olha que mão...perigando até perda de desempenho..

 

Infelizmente nem tudo é perfeito.. rsrs  

 

Ou uma outra saída seria você criar uma página que já lista os dados mais procurados.. como por exemplo nomes de empresas...  daí cabendo o usuário procurar o nome na lista... com um filtro.. ou usar o ctrl + F de localizar do navegador.. é uma ideia também..

 

PS: Tendo um sistema bem robusto.. bem feito(digo seguindo as boas práticas, usar criptografia quando necessário, usar identificadores)... é praticamente impossível um dado vazar para outro usuário.

 

Em todo o caso, boa sorte.

Postado

@dif Compreendo! Acredito que uma forma não muito boa, mas que teria um custo extremamente baixo é criar um arquivo php com um array com os dados das credenciais do banco de todos os clientes (espelho das informações de acesso presente na base de dados principal), tendo em vista o index o nome do cliente (único) e uma criptografia para as credenciais de acesso (user e pass). Sendo assim seria mil vezes mais fácil e menos custoso percorrer este array toda vez do que o banco de dados.

E toda vez que houver uma alteração nas credenciais de acesso das bases de dados dos clientes, este array seria modificado conforme!

 

O que acha disto?

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!