[firebase-br] Sincronização de bases de dados

Sandro Souza escovadordebits em gmail.com
Sexta Junho 19 18:24:35 -03 2020


Bom dia/tarde/noite Marcelo.

Bom, corrija-me se eu estiver entendido errado.

Pelo que entendi, cada loja tem sua base de dados própria e central, que
não está sendo sincronizada com as outras lojas em algum ponto central,
como em uma base de dados central em uma matriz (que ainda não existe).

Cada PDV não tem uma base de dados na própria máquina, e todos eles estão
acessando exatamente a mesma base de dados central da própria loja, dentro
da mesma rede local.

Esse cenário é o mais comum que vejo por aí.

Se você não está pensando em um cenário maior, continuará usando apenas uma
única base de dados, e nesse caso, não existe sincronização de dados com
quaisquer outra base de dados.

É o cenário mais simples.

Se a sua necessidade é apenas identificar em qual PDV foi feito um pedido,
poderia simplesmente acrescentar uma coluna na tabela de pedidos para que
fique registrado alí qual o PDV que gerou aquele pedido.

O que você está chamando de sincronização de dados, nesse cenário, mais
parece que é apenas o tratamento de concorrência entre os PDVs, já que eles
podem estar alterando, por exemplo, o saldo de estoque do mesmo produto.

Por exemplo, o PDV 5 pode estar vendendo 5 bananas, e o PDV 10 pode estar
vendendo mais 7 banadas, e cada um deles vai executar um UPDATE no
registro/linha contendo o saldo de estoque das bananas.

Seria mais ou menos essa a sua questão?

Ou você já está pensando em um cenário maior em que exista um local
central, como uma matriz, com uma base de dados central, e aí sim haveria
sincronização de dados entre as bases de dados de cada loja com essa base
de dados da "matriz"/"batcaverna"?

Queria entender melhor qual é exatamente a sua dúvida.

Quero lhe ajudar no que eu puder.

Em qui., 18 de jun. de 2020 às 10:38, Marcelo - MK Softwares <
marcelo em mksoftwares.com.br> escreveu:

> Obrigado perlo retorno Sandro
>
> Respondendo as suas perguntas:
> -Como é a arquitetura que você utiliza?
> Hoje a necessidade para essa função seria para supermercados e lojas de
> roupas, mas atendemos vários segmentos, menos farmácias e postos de
> gasolina.
>
> - Existe uma unidade matriz com uma base de dados própria?
> No momento são existe uma matriz propriamente dita, mas se for implantar
> esse cenário, ja pensei que terá que ser implantado uma matriz.
>
> - Cada loja (filial) tem a sua base de dados própria que deve ser
> sincronizada com a base da matriz?
> Sim hoje cada empresa tem uma base de dados local.
>
> - Dentro de cada loja, os PDVs usam uma base local própria que deve ser
> sincronizada com a base da loja?
> Sim os pdvs acessam uma base de dados localmente. O PDVs não tem uma
> base local, todos trabalham acessando o banco de dados na rede local.
>
> Você poderia fornecer mais detalhes?
> Veja se esta bem explicado, tenteni expor o máximo possivel do cenário.
>
> Em 18/06/2020 09:28, Sandro Souza escreveu:
> > Bom dia/tarde/noite meu nobre.
> >
> > Cada PDV está acessando uma base de dados local ou todos estão
> > acessando a mesma base do servidor?
> >
> > Veja o meu cenário e compare com o seu para verificar se algo pode ser
> > aproveitado.
> >
> > Trabalho em uma holding (conjunto de empresas), e nesse caso, um grupo
> > de distribuidoras de medicamentos farmacêuticos, com uma unidade
> > matriz e umas 10 unidades filiais atualmente.
> >
> > Inicialmente, a base de dados, em Oracle, fica na matriz, e as filiais
> > apenas acessam o sistema via terminal service (área de trabalho
> > remota) via link dedicado.
> >
> > O que fiz foi o seguinte: Vi as partes do sistema legado que mais são
> > utilizadas nas filiais, e criei uma base, em Firebird 2.5, contendo
> > apenas as tabelas que são utilizadas por essas primeiras partes.
> >
> > Para sincronizar tudo, acrescentei uma coluna de alteração tanto nas
> > tabelas da base principal Oracle como nas mesmas tabelas na base em
> > Firebird.
> >
> > Essa coluna que funciona como flag de alteração é do tipo TIMESTAMP e
> > opcional (não é NOT NULL), pois não adiantaria apenas marcar o
> > registro como "alterado ou não" (um CHAR(1) contendo S ou N, por
> > exemplo), pois enquanto um registro alterado fosse copiado de uma base
> > para a outra, ele poderia sofrer uma nova alteração, e sendo assim, ao
> > terminar de copiar a primeira versão do registro, e alterar o valor
> > dessa coluna para N, eu perderia as outras possíveis alterações.
> >
> > Deixando essa coluna como TIMESTAMP, eu salvo o momento da inserção ou
> > alteração do registro.
> >
> > Para garantir isso, e ficar de forma transparente para o sistema
> > legado, criei triggers/gatilhos para cada uma das tabelas a serem
> > sincronizadas.
> >
> > Essas triggers salvam o valor de CURRENT_TIMESTAMP nessa coluna de
> > "registro alterado".
> >
> > Se a coluna está vazia (NULL) significa que o registro não precisa ser
> > sincronizado, então eu pesquiso apenas por registros onde essa coluna
> > IS NOT NULL.
> >
> > Uma vez que o programa de sincronização de dados copia esse registro
> > de uma base para outra, ele faz um UPDATE naquele registro, passando
> > os valores da chave primária (é claro), mas também com a condição de
> > que a coluna de "registro alterado" tenha aquela data e hora lidos
> > inicialmente, ou seja, se essa coluna tinha o valor "2020-06-18
> > 10-01-23.456", e durante a copia do registro, o registro foi novamente
> > alterado, significa que agora essa mesma coluna já está com um outro
> > valor de data e hora, e sendo assim, quando executar o UPDATE TABELA_X
> > SET REGISTRO_ALTERADO = NULL WHERE (CHAVE_PRIMARIA =
> > valor-da-chave-primária) AND (REGISTRO_ALTERADO = '2020-06-18
> > 10-01-23.456'), significa que só vai limpar (NULL) a coluna de
> > "registro alterado" se não houve qualquer nova alteração nesse
> > registro durante a cópia.
> >
> > Se houve alguma alteração, o UPDATE não apagará o valor da coluna, por
> > conta dessa última condição, e dessa forma, eu não perco possíveis
> > novas alterações.
> >
> > No meu caso, a sincronização é sempre no duplo sentido, ou seja, do
> > Oracle para o Firebird e vice versa.
> >
> > Essa base em Firebird foi copiada para cada uma das filiais.
> >
> > No meu caso, o código da filial está incluído nos registros que são
> > tratados individualmente nas próprias filiais (o sistema legado já
> > nasceu assim).
> >
> > Por exemplo, o cadastro de produtos é único e global, todas as filiais
> > acessam, mas só a matriz pode incluir, alterar ou excluir. As filiais
> > podem apenas consultar.
> >
> > No caso dos estoques dos produtos, são individuais por filial, então a
> > tabela de dados de produto por filial contém todas as informações do
> > produto que são referente àquela filial (saldo em estoque, preço de
> > compra, preço de venda, etc...).
> >
> > Devido a essa arquitetura do sistema legado, não tive necessidade de
> > criar uma coluna separada de "registro alterado" para cada uma das
> > filiais, já que cada filial só alterará os registros referentes a ela
> > mesma (com o código da filial correspondente no próprio registro),
> > então não há choque de informações.
> >
> > O programa de sincronização de dados que eu desenvolvi funciona dentro
> > da matriz, e conecta com cada uma das bases Firebirds de cada uma das
> > filiais, fazendo tudo acontecer de forma organizada, inclusive com
> > tolerância a quedas de conexão.
> >
> > Como é a arquitetura que você utiliza?
> >
> > Existe uma unidade matriz com uma base de dados própria?
> >
> > Cada loja (filial) tem a sua base de dados própria que deve ser
> > sincronizada com a base da matriz?
> >
> > Dentro de cada loja, os PDVs usam uma base local própria que deve ser
> > sincronizada com a base da loja?
> >
> > Você poderia fornecer mais detalhes?
> >
> > Espero ter mais ajudado que atrapalhado. :D
> >
> >
> > Em qua., 17 de jun. de 2020 às 21:49, Marcelo - MK Softwares
> > <marcelo em mksoftwares.com.br <mailto:marcelo em mksoftwares.com.br>>
> escreveu:
> >
> >     Pessoal boa noite
> >
> >     Como fazer a sincronização de bases de dados. Cenário:
> >
> >     - Um servidor sofrendo alterações diversas em seus registros, e um ou
> >     vários PDVs vendendo na loja, isso em rede local;
> >
> >     - Um servidor sofrendo alterações diversas em seus registros, e as
> >     outras filiais vendendo.
> >
> >     Até imagino que a cada registro alterado o mesmo poderia ter uma
> >     flag de
> >     alteração e os "clients" usariam essa flag para localizar os
> >     registros
> >     alterados e sincronizar. Mas no caso dos PDVs, onde pode ser um ou
> >     vários, uma flag não bastaria, teria que ter uma flag para cada
> >     pdv, e
> >     se tiver 30 pdvs na loja, terei 30 flags no banco.
> >
> >     Hoje uso linguagem C# desenvolvendo aplicações desktop.
> >
> >     Se alguém puder dar alguma sugestão agradeço.
> >
> >     ______________________________________________
> >     FireBase-BR (www.firebase.com.br <http://www.firebase.com.br>) -
> >     Hospedado em www.locador.com.br <http://www.locador.com.br>
> >     Para saber como gerenciar/excluir seu cadastro na lista, use:
> >     http://www.firebase.com.br/fb/artigo.php?id=1107
> >     Para consultar mensagens antigas:
> >     http://www.firebase.com.br/pesquisa_lista.html
> >
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas:
> http://www.firebase.com.br/pesquisa_lista.html
>


Mais detalhes sobre a lista de discussão lista