Sistema Multi Empresa com um banco de dados para cada empresa.

466 views
Skip to first unread message

Emerson Henning

unread,
Feb 23, 2012, 11:53:50 AM2/23/12
to rail...@googlegroups.com
Ol�,

Sou novo no mundo Ruby + Rails e estou pensando em desenvolver
um novo sistema usando rails que ser� multi empresa e cada empresa ter�
o seu banco de dados separado (mysql), tenho outros sistemas que s�o em
PHP dessa mesma forma, um DB para cada cliente, e funciona perfeitamente.

Existe alguma maneira f�cil de trabalhar com v�rios bancos no
rails ? � vi�vel (performance) ? Vejo algumas pessoas falando que n�o �
muito bom trabalhar dessa forma mas n�o explicam muito o porque

N�o gostaria de come�ar todo um processo de estudo,
desenvolvimento e depois de um tempo perceber que n�o vai ficar legal,
ou ainda, todo o charme do rails com suas abstra��es, desenvolvimento
�gil, etc, n�o ser�o muito �teis nesse tipo de projeto.

Algu�m trabalha dessa forma com rails ?

Everaldo Gomes

unread,
Feb 23, 2012, 11:56:21 AM2/23/12
to rail...@googlegroups.com
Oi!

Não tinha visto essa abordagem até hoje, mas talvez não seja difícil fazê-la.

ActiveRecord tem um método chamado establish_connection, você pode usá-lo e passar os parâmetros necessários para cada cliente seu:

establish_connection(spec = ENV["DATABASE_URL"])

Establishes the connection to the database. Accepts a hash as input where the :adapter key must be specified with the name of a database adapter (in lower-case) example for regular databases (MySQL, Postgresql, etc):


ActiveRecord::Base.establish_connection(
  :adapter  => "mysql",
  :host     => "localhost",
  :username => "myuser",
  :password => "mypass",
  :database => "somedatabase"
)

Att.

Everaldo

2012/2/23 Emerson Henning <eme...@henning.com.br>
Olá,

       Sou novo no mundo Ruby + Rails e estou pensando em desenvolver um novo sistema usando rails que será multi empresa e cada empresa terá o seu banco de dados separado (mysql), tenho outros sistemas que são em PHP dessa mesma forma, um DB para cada cliente, e funciona perfeitamente.

       Existe alguma maneira fácil de trabalhar com vários bancos no rails ? É viável (performance) ? Vejo algumas pessoas falando que não é muito bom trabalhar dessa forma mas não explicam muito o porque

       Não gostaria de começar todo um processo de estudo, desenvolvimento e depois de um tempo perceber que não vai ficar legal, ou ainda, todo o charme do rails com suas abstrações, desenvolvimento ágil, etc,  não serão muito úteis nesse tipo de projeto.

       Alguém trabalha dessa forma com rails ?



--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+unsubscribe@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

Igor Batista

unread,
Feb 23, 2012, 12:03:19 PM2/23/12
to rail...@googlegroups.com
Vai ser apenas uma unica app utilizando vários bancos ?





Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7



--
[]'s
Igor C. Batista
SKYPE: mld_crark
G -TALK: igor.b...@gmail.com
twitter: @igorcbatista

Tem um segundo? Então, dá uma olhadinha nisso:
Um site de publicidades, de Portugal, está pagando em euros (quase 3x mais que em reais)
pra quem estiver disposto visitem:
http://ptcganhandodinheiro.blogspot.com/

Emerson Henning

unread,
Feb 23, 2012, 12:10:16 PM2/23/12
to rail...@googlegroups.com
Sim.

2012/2/23 Emerson Henning <eme...@henning.com.br>

Marcelo Henrique

unread,
Feb 23, 2012, 12:11:31 PM2/23/12
to rail...@googlegroups.com
dependendo do Login voce escolhe o banco correto ?
                                              - Marcelo Henrique -
  "Se não puder se destacar pelo talento, vença pelo esforço." (Dave Weinbaum)

Emerson Henning

unread,
Feb 23, 2012, 12:19:15 PM2/23/12
to rail...@googlegroups.com
Sim.

Paulo Pessoa

unread,
Feb 23, 2012, 12:20:31 PM2/23/12
to rail...@googlegroups.com
Rails é perfeitamente cabível para este tipo de sistema. 
Pesquise sobre sistemas multi-tenant.

Everaldo Gomes

unread,
Feb 23, 2012, 12:41:18 PM2/23/12
to rail...@googlegroups.com
Achei isso no stackoverflow. Procurei no google por: "rails one database per user"

Emerson Henning

unread,
Feb 23, 2012, 12:59:16 PM2/23/12
to rail...@googlegroups.com

Fernando Almeida

unread,
Feb 23, 2012, 1:00:39 PM2/23/12
to rail...@googlegroups.com
Eu faço isso em uma aplicação Rails mas o banco é definido pelo subdomínio acessado, então os usuários também são cadastrados em cada banco específico.

O ruim dessa abordagem é que no deploy você precisa rodar migrations em todos os bancos mas por isso não está sendo problema para mim, com Capistrano também ficou muito fácil de fazer.
Fernando Almeida
www.fernandoalmeida.net

thiagocifani

unread,
Feb 23, 2012, 1:03:11 PM2/23/12
to rail...@googlegroups.com
voce poderia postar algum exemplo de codigo do subdominio e o banco Fernando?
thiagocifani

Emerson Henning

unread,
Feb 23, 2012, 1:15:50 PM2/23/12
to rail...@googlegroups.com
Como você faz as migrations de cada base ?

Everaldo Gomes

unread,
Feb 23, 2012, 1:17:43 PM2/23/12
to rail...@googlegroups.com
Vou me intrometer:

1. Suponha que você tem 1 base de dados na aplicação, onde você guarda cada usuário seu (as credenciais etc.)

2. Faça um script onde você percorre essa lista de usuários e invoque a migration para cada um deles.

2012/2/23 Emerson Henning <eme...@henning.com.br>

mairon brasil

unread,
Feb 23, 2012, 1:21:26 PM2/23/12
to rails-br
tem tb uma gem chamada octopus de um pessoal brazuca ainda se nao me
engano parece bem interesante

https://github.com/tchandy/octopus

Fernando Almeida

unread,
Feb 23, 2012, 2:44:32 PM2/23/12
to rail...@googlegroups.com
Uso algo mais ou menos assim:

https://gist.github.com/1894615

Na verdade o ApplicationController está precisando de refatoração para usar também as configs do database.yml. A aplicação começou a rodar agora, tem poucos clientes ainda, estou ajustando essas coisas.

Abraços.

Breno Santos Salgado

unread,
Feb 23, 2012, 4:52:35 PM2/23/12
to rails-br
você tem certeza que essa abordagem é necessária? eu nunca fiz isso,
mas cheira a dor de cabeça, as vezes só relacionamentos é suficiente e
mais aplicável
ainda mais se for considerar questão de escalabilidade do negócio e da
aplicação
por exemplo, cada cadastro novo de empresa vc vai criar um banco de
dados novo e ter que preparar um monte de coisa? pra automatizar deve
ser necessário um bom tanto de scripts... por aí vai

mas talvez seja necessário, não sei... no começo teve vezes que eu
achava que certas coisas funcionavam a base de vários dbs e depois
realizei que eu tava enganado

On 23 fev, 17:44, Fernando Almeida <ferna...@fernandoalmeida.net>
wrote:
> Uso algo mais ou menos assim:
>
> https://gist.github.com/1894615
>
> Na verdade o ApplicationController está precisando de refatoração para usar
> também as configs do database.yml. A aplicação começou a rodar agora, tem
> poucos clientes ainda, estou ajustando essas coisas.
>
> Abraços.
>
> Em 23 de fevereiro de 2012 16:03, thiagocifani
> <cifani.thi...@gmail.com>escreveu:
>
>
>
>
>
>
>
>
>
> > voce poderia postar algum exemplo de codigo do subdominio e o banco
> > Fernando?
>
> > Em 23 de fevereiro de 2012 16:00, Fernando Almeida <
> > ferna...@fernandoalmeida.net> escreveu:
>
> > Eu faço isso em uma aplicação Rails mas o banco é definido pelo subdomínio
> >> acessado, então os usuários também são cadastrados em cada banco específico.
>
> >> O ruim dessa abordagem é que no deploy você precisa rodar migrations em
> >> todos os bancos mas por isso não está sendo problema para mim, com
> >> Capistrano também ficou muito fácil de fazer.
>
> >> Em 23 de fevereiro de 2012 15:41, Everaldo Gomes <
> >> everaldo.go...@gmail.com> escreveu:
>
> >> Achei isso no stackoverflow. Procurei no google por: "rails one database
> >>> per user"
>
> >>>http://stackoverflow.com/questions/58755/what-is-the-best-way-to-do-p...
>
> >>> 2012/2/23 Paulo Pessoa <paulopes...@gmail.com>
>
> >>>> Rails é perfeitamente cabível para este tipo de sistema.
> >>>> Pesquise sobre sistemas *multi-tenant*.
>
> >>>> On Thu, Feb 23, 2012 at 2:11 PM, Marcelo Henrique <
> >>>> marceloh...@gmail.com> wrote:
>
> >>>>> dependendo do Login voce escolhe o banco correto ?
>
> >>>>> Em 23 de fevereiro de 2012 15:10, Emerson Henning <
> >>>>> emer...@henning.com.br> escreveu:
>
> >>>>>  Sim.
>
> >>>>>> Em 23/02/2012 15:03, Igor Batista escreveu:
>
> >>>>>> Vai ser apenas uma unica app utilizando vários bancos ?
>
> >>>>>> Em 23 de fevereiro de 2012 13:56, Everaldo Gomes <
> >>>>>> everaldo.go...@gmail.com> escreveu:
>
> >>>>>>> Oi!
>
> >>>>>>>  Não tinha visto essa abordagem até hoje, mas talvez não seja
> >>>>>>> difícil fazê-la.
>
> >>>>>>>  ActiveRecord tem um método chamado establish_connection, você pode
> >>>>>>> usá-lo e passar os parâmetros necessários para cada cliente seu:
>
> >>>>>>>   *establish_connection*(spec = ENV["DATABASE_URL"])
>
> >>>>>>> Establishes the connection to the database. Accepts a hash as input
> >>>>>>> where the :adapter key must be specified with the name of a
> >>>>>>> database adapter (in lower-case) example for regular databases (MySQL,
> >>>>>>> Postgresql, etc):
>
> >>>>>>> ActiveRecord::Base.establish_connection(
> >>>>>>>   :adapter  => "mysql",
> >>>>>>>   :host     => "localhost",
> >>>>>>>   :username => "myuser",
> >>>>>>>   :password => "mypass",
> >>>>>>>   :database => "somedatabase"
> >>>>>>> )
>
> >>>>>>>  Att.
>
> >>>>>>>  Everaldo
>
> >>>>>>> 2012/2/23 Emerson Henning <emer...@henning.com.br>
>
> >>>>>>>> Olá,
>
> >>>>>>>>        Sou novo no mundo Ruby + Rails e estou pensando em
> >>>>>>>> desenvolver um novo sistema usando rails que será multi empresa e cada
> >>>>>>>> empresa terá o seu banco de dados separado (mysql), tenho outros sistemas
> >>>>>>>> que são em PHP dessa mesma forma, um DB para cada cliente, e funciona
> >>>>>>>> perfeitamente.
>
> >>>>>>>>        Existe alguma maneira fácil de trabalhar com vários bancos
> >>>>>>>> no rails ? É viável (performance) ? Vejo algumas pessoas falando que não é
> >>>>>>>> muito bom trabalhar dessa forma mas não explicam muito o porque
>
> >>>>>>>>        Não gostaria de começar todo um processo de estudo,
> >>>>>>>> desenvolvimento e depois de um tempo perceber que não vai ficar legal, ou
> >>>>>>>> ainda, todo o charme do rails com suas abstrações, desenvolvimento ágil,
> >>>>>>>> etc,  não serão muito úteis nesse tipo de projeto.
>
> >>>>>>>>        Alguém trabalha dessa forma com rails ?
>
> >>>>>>>> --
> >>>>>>>> Você recebeu essa mensagem porquê está inscrito no Google
> >>>>>>>> Groups "rails-br".
> >>>>>>>> Para enviar uma mensagem para o grupo, mande um email para
> >>>>>>>> rail...@googlegroups.com
> >>>>>>>> Para se descadastrar, mande um e-mail para
> >>>>>>>> rails-br+u...@googlegroups.com
> >>>>>>>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>>>>>>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >>>>>>>    --
> >>>>>>> Você recebeu essa mensagem porquê está inscrito no Google
> >>>>>>> Groups "rails-br".
> >>>>>>> Para enviar uma mensagem para o grupo, mande um email para
> >>>>>>> rail...@googlegroups.com
> >>>>>>> Para se descadastrar, mande um e-mail para
> >>>>>>> rails-br+u...@googlegroups.com
> >>>>>>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>>>>>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >>>>>>  --
> >>>>>> []'s
> >>>>>> Igor C. Batista
> >>>>>> SKYPE: mld_crark
> >>>>>> G -TALK: igor.bati...@gmail.com
> >>>>>> twitter: @igorcbatista
>
> >>>>>> Tem um segundo? Então, dá uma olhadinha nisso:
> >>>>>> Um site de publicidades, de Portugal, está pagando em euros (quase 3x
> >>>>>> mais que em reais)
> >>>>>> pra quem estiver disposto visitem:
> >>>>>>http://ptcganhandodinheiro.blogspot.com/
>
> >>>>>>  --
> >>>>>> Você recebeu essa mensagem porquê está inscrito no Google
> >>>>>> Groups "rails-br".
> >>>>>> Para enviar uma mensagem para o grupo, mande um email para
> >>>>>> rail...@googlegroups.com
> >>>>>> Para se descadastrar, mande um e-mail para
> >>>>>> rails-br+u...@googlegroups.com
> >>>>>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>>>>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >>>>>>  --
> >>>>>> Você recebeu essa mensagem porquê está inscrito no Google
> >>>>>> Groups "rails-br".
> >>>>>> Para enviar uma mensagem para o grupo, mande um email para
> >>>>>> rail...@googlegroups.com
> >>>>>> Para se descadastrar, mande um e-mail para
> >>>>>> rails-br+u...@googlegroups.com
> >>>>>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>>>>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >>>>> --
> >>>>>                                               - Marcelo Henrique -
> >>>>>   "Se não puder se destacar pelo talento, vença pelo esforço." (Dave
> >>>>> Weinbaum)
>
> >>>>>  --
> >>>>> Você recebeu essa mensagem porquê está inscrito no Google
> >>>>> Groups "rails-br".
> >>>>> Para enviar uma mensagem para o grupo, mande um email para
> >>>>> rail...@googlegroups.com
> >>>>> Para se descadastrar, mande um e-mail para
> >>>>> rails-br+u...@googlegroups.com
> >>>>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>>>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >>>>  --
> >>>> Você recebeu essa mensagem porquê está inscrito no Google
> >>>> Groups "rails-br".
> >>>> Para enviar uma mensagem para o grupo, mande um email para
> >>>> rail...@googlegroups.com
> >>>> Para se descadastrar, mande um e-mail para
> >>>> rails-br+u...@googlegroups.com
> >>>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >>>  --
> >>> Você recebeu essa mensagem porquê está inscrito no Google
> >>> Groups "rails-br".
> >>> Para enviar uma mensagem para o grupo, mande um email para
> >>> rail...@googlegroups.com
> >>> Para se descadastrar, mande um e-mail para
> >>> rails-br+u...@googlegroups.com
> >>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >> --
> >> Fernando Almeida
> >>www.fernandoalmeida.net
>
> >>  --
> >> Você recebeu essa mensagem porquê está inscrito no Google
> >> Groups "rails-br".
> >> Para enviar uma mensagem para o grupo, mande um email para
> >> rail...@googlegroups.com
> >> Para se descadastrar, mande um e-mail para
> >> rails-br+u...@googlegroups.com
> >> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >> Leia nossa política de uso:http://goo.gl/YGgt7
>
> > --
> > thiagocifani
> >http://thiagocifani.wordpress.com/
> > twitter.com/thiagocifani
> > del.icio.us/thiagocifani
> > <http://del.icio.us/thiagocifani>
>
> >  --
> > Você recebeu essa mensagem porquê está inscrito no Google
> > Groups "rails-br".
> > Para enviar uma mensagem para o grupo, mande um email para
> > rail...@googlegroups.com
> > Para se descadastrar, mande um e-mail para
> > rails-br+u...@googlegroups.com
> > Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR

Fernando Almeida

unread,
Feb 23, 2012, 5:38:29 PM2/23/12
to rail...@googlegroups.com
O lado bom de fazer dessa forma é que dá para dividir a carga dos bancos entre servidores sem precisar fazer cluster, particionamento, etc mantendo ainda a centralização do código da aplicação.

Eu acho que separar a nível de registro cria uma complexidade maior na hora de escalar, nos backups, para otimizar consultas, etc. Mas enfim, cada abordagem tem suas vantagens e desvantagens.

O serviço de lojas virtuais da Locaweb por exemplo, funciona com bancos separados para cada cliente e código centralizado como eu faço (assisti uma palestra deles, acho que foi no FISL se não me engano).

O Basecamp separa a nível de registro com um "account_id" e todas as buscas a partir de um "@current_account", por exemplo.

http://37signals.com/svn/posts/1512-how-to-do-basecamp-style-subdomains-in-rails

No meu caso, achamos melhor como está hoje.



Leia nossa política de uso: http://goo.gl/YGgt7



--
Fernando Almeida
www.fernandoalmeida.net

Márcio D. Carvalho

unread,
Feb 23, 2012, 6:25:23 PM2/23/12
to rails-br
Estou desenvolvendo um sistema exatamente dessa forma. Um app para
várias empresas e cada empresa com seu banco. A forma mais simples e
eficiente que encontrei foi utilizando essa gem aqui:
https://github.com/bradrobertson/apartment.

E funciona sim. A Locaweb tem um sistema de e-commerce que funciona
dessa forma. Link da palestra do RubyConf:
http://www.eventials.com/rubyconfbr/recorded/M2UzZTJkMzY2MzdiNTg2NTUxNWM1MzI3NWY1YjRhMzYjIzM3Nw_3D_3D

Márcio D. Carvalho

Fernando Almeida

unread,
Feb 23, 2012, 6:32:29 PM2/23/12
to rail...@googlegroups.com
Pronto, foi na RubyConf a palestra que tinha comentado, achei que tinha sido no FISL :-)

Gostei da gem.

Valeu Márcio!


--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+u...@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7



--
Fernando Almeida
www.fernandoalmeida.net

Emerson Henning

unread,
Feb 23, 2012, 6:44:00 PM2/23/12
to rail...@googlegroups.com
Olá,
       

        Obrigado... deu para entender o conceito...

Emerson Henning

unread,
Feb 23, 2012, 6:48:40 PM2/23/12
to rail...@googlegroups.com
Muito boa essa gem, principalmente pela parte da migration.

Em 23/02/2012 21:25, M�rcio D. Carvalho escreveu:
> Estou desenvolvendo um sistema exatamente dessa forma. Um app para

> v�rias empresas e cada empresa com seu banco. A forma mais simples e


> eficiente que encontrei foi utilizando essa gem aqui:
> https://github.com/bradrobertson/apartment.
>
> E funciona sim. A Locaweb tem um sistema de e-commerce que funciona
> dessa forma. Link da palestra do RubyConf:
> http://www.eventials.com/rubyconfbr/recorded/M2UzZTJkMzY2MzdiNTg2NTUxNWM1MzI3NWY1YjRhMzYjIzM3Nw_3D_3D
>

> M�rcio D. Carvalho
>

Reply all
Reply to author
Forward
0 new messages