• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

javac

Sincronizar Sql com MySql

18 mensagens neste tópico

Boas estou a criar uma aplicação que se pretende sincronizar dados entre uma base de dados local que é Sqlexpress com uma base de dados remota que é Mysql....

Gostava de saber quais a vossa tecnicas para sincronzar as bases de dados neste momento estou a usar o método "merge" que já ajuda no alterar e inserir novos registos...o meu problema é quando se elimina um registo como se faz?

Porque quando se eliminar um registo na base dados remota e ao executar o merge ele ignora o registo na base de dados local o que faz com que continue guardado! isto acontece também vice-versa...como voçes resolvem este problema?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Normalmente nunca apago registos. Uso uma flag (bit) para dizer se está activo ou não.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se calhar não é o que queres. Mas no trabalho quando trabalho com várias BDs e precisamos efectuar sincronizações entre elas, usamos a plataforma Microsoft Sync Framework.

Muito boa, apesar que visto que usas MySql, muita das ligações vais ter que fazer à mão o que dá bastante trabalho no inicio. Mas se calhar para o que queres seja overkill e não compensa o trabalho...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se calhar não é o que queres. Mas no trabalho quando trabalho com várias BDs e precisamos efectuar sincronizações entre elas, usamos a plataforma Microsoft Sync Framework.

Muito boa, apesar que visto que usas MySql, muita das ligações vais ter que fazer à mão o que dá bastante trabalho no inicio. Mas se calhar para o que queres seja overkill e não compensa o trabalho...

Vou ver como funciona...obrigado pela dica.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pelo que estive a ver a ferramenta Microsoft Sync Framework parece ser uma solução funcional mas um pouco complexa para quem nunca mexeu naquelas classes...nem sei como começar por fazer um projecto simples que sincroniza uma tabela sql para uma tabela identica mysql...

A outra solução de colocar um campo com que desactive o registo parece-me ser a solução que possa obtar se não conseguir usar o Microsoft Sync Framework...tenho umas 2 semanas para me ambientar por isso qualquer ajuda extra seria muito bem vinda...

Obrigado pelos comments e estou aberto a mais soluções ou exemplos de como usar Microsoft Sync Framework

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Normalmente nunca apago registos. Uso uma flag (bit) para dizer se está activo ou não.

Por si só isso é um erro.

E se alguma vez lidaste com bases de dados com alguma dimensão e com querys pesadas vais perceber isso.

É verdade que devemos evitar apagar dados das BDs, porque mesmo que os dados não sejam úteis agora, podem voltar a ser no Futuro. No entanto há excepções. Tal como normalizamos as BDs, também é por vezes desnormalizar um pouco para melhorar a performance, também por vezes temos que fazer excepções a esta regra. Aqui vão alguns exemplos de situações:

* quando tratamos com bds que têm dados pessoais, a lei exige que em determinadas situações eliminemos os dados (por exemplo a pedido do dono dos dados);

* dados que não são utilizados e que estão numa tabela com muitos registos, fazem com que as querys nessa tabela se tornem mais complexas e/ou lentas;

* há dados que ao fim de determinado tempo deixam mesmo de ter utilidade de forma permanente;

Que fazer então?

Exemplos:

* apagar os registos definitivamente, quando deixam de ser definitivamente necessários;

* mover os registos que podem voltar a ser necessários para um arquivo morto (o que implica apagar numa tabela e escrever em outra);

* utilizar particionamento horizontal das tabelas (e neste caso a flag pode fazer sentido, pois pode ser utilizada para fazer o particionamento);

Quanto à dúvida:

Se quiseres fazer programaticamente sugiro que utilizes algo independente da plataforma e do fabricante e com provas dadas. Faria isso em Perl, que tem excelentes bibliotecas para lidar com bases de dados de forma abstracta e até com OOP. Podes até gerar os schemas para diferentes SGDB a partir dos objectos de Perl, o que te reduz o trabalho de gerir os schemas e aproveitar os objectos para as tuas aplicações (e não apenas a que sincronizaria as BDs) :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, obrigado pelo conselho mas o problema é que sou obrigado a usar c#, também não me ambientei à framework, demasiado complexa e nao tenho tempo para apreder a mexer.

Alguem sabe como sincronizar datatables, pois o problema não basta sincronizar mas sim ver se o registo do servidor já foi alterada por outro utilizador visto ser uma aplicação distribuída. Como fazem a resolução de conflitos...como pedir ao utilizador o que fazer?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Alguem sabe como sincronizar datatables, pois o problema não basta sincronizar mas sim ver se o registo do servidor já foi alterada por outro utilizador visto ser uma aplicação distribuída. Como fazem a resolução de conflitos...como pedir ao utilizador o que fazer?

Só dá com este tipo de métodos... São servidores de SGDB diferentes de fabricantes diferentes e não há um standard para este tipo de coisas.

Registo do servidor? Que registo?

Distribuida? Como?

Um pouco mais de informação...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só dá com este tipo de métodos... São servidores de SGDB diferentes de fabricantes diferentes e não há um standard para este tipo de coisas.

Registo do servidor? Que registo?

Distribuida? Como?

Um pouco mais de informação...

Registo isto é dados... tipo um registo = nome,idade,nacionalidade...

Distribuida = Vários clientes a aceder aos mesmos dados e a sincronizar os mesmos existindo gestao de conflitos...

Cada cliente tem uma base dados local que vai ter de sincronizar com a remota.. tem de ser local SQL espress e a remota MYSql...

O problema em sincronizar é que nao podemos sobrepor a informação da BD local para a BD remota...antes temos de verificar se esses dados não sofreram alterações desde a ultima versão que foi recebida por esse cliente. Não sei se me fiz entender :-S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Registo isto é dados... tipo um registo = nome,idade,nacionalidade...

Então porque é que falaste em registo de servidor?

Ainda se tivesses dito que era um registo no servidor... Agora do servidor engana facilmente o pessoal.

Fiquei logo a pensar que fosse outra coisa qualquer completamente diferente.

Cada cliente tem uma base dados local que vai ter de sincronizar com a remota.. tem de ser local SQL espress e a remota MYSql...

Até que enfim que começas a explicar o que queres realmente fazer.

Tens alguma razão para não usar apenas MySQL?

Não consigo ver nenhuma boa razão para que não o faças à partida.

Se não usares só MySQL, isso nunca vai funcionar do lado dos SGDBs.

Em primeiro lugar o número de clientes vai escalar?

Se não tiver que escalar o ideal seria utilizares apenas MySQL com replicação multi-master.

Caso tenhas que escalar, vais ter muito código para escrever. E não vai ser o SGDB a sincronizar nada... E vais precisar de criar uma aplicação bastante complexa. Mas sem conhecer muito mais sobre o que estás a fazer não te posso indicar uma solução.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema em sincronizar é que nao podemos sobrepor a informação da BD local para a BD remota...antes temos de verificar se esses dados não sofreram alterações desde a ultima versão que foi recebida por esse cliente. Não sei se me fiz entender :-S

Caso tenhas que escalar, vais ter muito código para escrever. E não vai ser o SGDB a sincronizar nada... E vais precisar de criar uma aplicação bastante complexa. Mas sem conhecer muito mais sobre o que estás a fazer não te posso indicar uma solução.

É mesmo para estes casos que existe a sync framework ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
É mesmo para estes casos que existe a sync framework

Que é proprietária, e por tanto nunca recomendada por mim. Que só funciona em .net, ou seja, na realidade só vai funcionar (pelo menos correctamente) em window$.

A framework é, isso mesmo,  uma base de trabalho. Não é uma solução final, ou seja, indepentemente de usares a framework da m$, ou outra coisa qualquer, como sistemas ORM, disponíveis para verdadeiras soluções multi-plataforma ainda tens que fazer bastante trabalho de desenvolvimento.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, estou a ver que o mundo da sincronização entre SGBD diferentes é complicado mas já consegui elaborar um algoritmo um pouco lixado que sincroniza e pergunta ao utilizador o que pretende fazer com os conflitos que encontra...

Mas penso que é um algoritmo um pouco pesado...mas sendo isto um trabalho académico não me queixo...

Sei que o ideal era usar somente uma única SGBD mas estou proibido  :P

obrigado pelas dicas...mais comentários são sempre bem-vindos.  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Que é proprietária, e por tanto nunca recomendada por mim. Que só funciona em .net, ou seja, na realidade só vai funcionar (pelo menos correctamente) em window$.

A framework é, isso mesmo,  uma base de trabalho. Não é uma solução final, ou seja, indepentemente de usares a framework da m$, ou outra coisa qualquer, como sistemas ORM, disponíveis para verdadeiras soluções multi-plataforma ainda tens que fazer bastante trabalho de desenvolvimento.

Nada é perfeito :)

Obviamente que em alguns casos dá trabalho, noutros nem por isso. Se as tuas BDs forem SqlServer e SqlServerCE muito já está automatizado. A Microsoft não dorme em serviço.

Claro que se for por exemplo MySQL e/ou Firebird (duas outras que usamos bastante) já terás que fazer parte do código à mão, a interface entre as várias BDs.

Mas como sistema é muito bom, não conheço nada melhor.

---

javac funciona? Portanto já é bom. Agora podes é melhorar, que fica sempre bem.

Que queres dizer com pesado?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Boas, estou a ver que o mundo da sincronização entre SGBD diferentes é complicado mas já consegui elaborar um algoritmo um pouco lixado que sincroniza e pergunta ao utilizador o que pretende fazer com os conflitos que encontra...

Não acho que seja boa ideia o utilizador decidir isso...

Sei que o ideal era usar somente uma única SGBD mas estou proibido

Podes explicar porquê?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não acho que seja boa ideia o utilizador decidir isso...

Podes explicar porquê?

Apenas vai perguntar ao utilizador se pretende manter as alterações do registo que se encontra no servidor ou deseja guardar os dados que o cliente alterou..

Estou proibido porque é um trabalho académico e uma das coisas que vamos aprender (que estou a aprender :-) ) é que SGBD diferentes na mesma aplicação não é o ideal para sincronizar dados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estou proibido porque é um trabalho académico e uma das coisas que vamos aprender (que estou a aprender :-) ) é que SGBD diferentes na mesma aplicação não é o ideal para sincronizar dados.

LOL!!!

E é preciso um trabalho para isso? LOL

Os teus profs são gente muito doente...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

LOL!!!

E é preciso um trabalho para isso? LOL

Os teus profs são gente muito doente...

Não posso fazer nada quanto a isso :)

Obrigado pelas dicas

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora