lailsonbm 0 Denunciar post Postado Janeiro 10, 2005 Olá Fórum iMasters, Fui encarregado de desenvolver um sistema em .NET para uma certa empresa. Ele funciona basicamente da seguinte forma: - Há usuários com programas desktop (cliente/servidor) e um servidor do sistema na web. - Os usuários têm uma base de dados local (baseada em arquivos XML e schemas, já que a aplicação desktop deve ser portável, funcionando em um disquete) e há uma base de dados global (do servidor web). - A tarefa principal dos usuários é a seguinte: incluir dados em seus sistemas e, após a inclusão, enviar as alterações à base de dados global via internet (um webservice encarrega-se disso). - Cada usuário pode alterar (incluir/editar/excluir) somente seus dados; nunca dados de outros usuários. - Os usuários não podem perder seus dados; todas as informações, desde o início, devem ficar na base local. Parece simples, mas quando eu fui pensar em como fazer isso (estou em fase de sondagens, pré planejamento) realmente eu vi que tinha um problema. Não consigo pensar em uma forma eficiente de fazer isso. A primeira idéia foi enviar toda a database local (através de um dataset), mas isso mostrou-se impraticável, já que o volume de dados deve crescer ao longo do tempo. A segunda opção foi pensar em criar uma parte da aplicação que analisasse as alterações e enviasse um SqlCommand que alteraria a database global. Assim, haveria duas bases de dados: a que contivesse os dados na última atualização e outra que pudesse ser alterada. No momento do envio das informações, o sistema compara as suas e verifica as alterações, criando o SqlCommand. Mas aí eu esbarro em dois problemas: o processo pode consumir recursos demais da máquina, uma vez que a base de dados local é baseada em arquivos XML e, nesse processamento, trabalha-se com duas; a segurança também fica comprometida, uma vez que o webservice não pode controlar quem manipula os registros (se um usuário1 for mal intencionado, pode acabar alterando dados de um usuario2, inserido um registro, por exemplo). =============== Abaixo vão alguns exemplos de tabelas que dão uma idéia melhor do que eu penso em fazer. ------------------------------- | DADO1 | DADO2 | DADO3 | ------------------------------- |Valor1 |Valor2 |Valor3 | ------------------------------- Tabela da database do Usuario1. ------------------------------- | DADO1 | DADO2 | DADO3 | ------------------------------- |Valor4 |Valor5 |Valor6 | |Valor7 |Valor8 |Valor9 | ------------------------------- Tabela da database do Usuário2. ------------------------------------------- | DADO1 | DADO2 | DADO3 | USUARIO | ------------------------------------------- |Valor1 |Valor2 |Valor3 |Usuario1 | |Valor4 |Valor5 |Valor6 |Usuario2 | |Valor7 |Valor8 |Valor9 |Usuario2 | ------------------------------------------- Tabela da database do servidor. =============== COMO EU ESTOU PENSANDO EM FAZER Vamos supor que a tabela do Usuário2 fosse a da última atualização do sistema. Aí ele resolve alterar alguns dados: exclui a linha2 e inclui outro registro. A base ficaria assim: ------------------------------- | DADO1 | DADO2 | DADO3 | ------------------------------- |Valor4 |Valor5 |Valor6 | |Valor7 |Valor8 |Valor9 | ------------------------------- Tabela da database do Usuário2, reserva. ------------------------------- | DADO1 | DADO2 | DADO3 | ------------------------------- |Valor4 |Valor5 |Valor6 | |Valor10 |Valor11 |Valor12 | ------------------------------- Tabela da database do Usuário2, alterada. No momento do envio das informações, o sistema compararia as duas bases e verificaria as alterações realizadas. Criaria então um SqlCommand, com as seguintes instruções SQL: DELETE * FROM Tabela WHERE DADO1 = 'Valor4' AND DADO2 = 'Valor5' AND DADO3 = 'Valor6' INSERT INTO Tabela (DADO1, DADO2, DADO3, USUARIO) VALUES ('Valor10', 'Valor11', 'Valor12', 'Usuário2') Após a confirmação da atualização da base de dados global, a base de dados local de reserva do Usuario2 seria substituida pela alterada e uma cópia dessa base seria colocada no lugar da alterada para futuras alterações e o processo poderia se repetir indefinidamente. =============== Gostaria então que vocês avaliassem esse método e sugerissem formas, dentro do universo .NET, de como resolver os problemas expostos. Obrigado pela atenção (realmente o post ficou grande), Lailson Bandeira Compartilhar este post Link para o post Compartilhar em outros sites
rglauser 0 Denunciar post Postado Janeiro 15, 2005 Olá Lailson Você está no caminho certo, acredito que a maior parte da sua arquitetura está legal. O WebService fazendo o controle de alterações acredito que seja a melhor opção mesmo. Recomendo o uso de dataset para o tráfego entre o client e o WebService pois ele é um objeto serializável e permite você comparar as duas fontes e propagar a atualização no Banco de Dados do Servidor. Se você precisa manter a base de dados do cliente intacta , ela tenderá a crescer e com isso o XML passa a não ser mais indicado. Em uma palestra do Renato Haddad ele disse que arquivos XML perdem rendimento quando passam de 300K , o que é muito pouco. A não ser que você fragmente os arquivos por exemplo NomeUsuario_Data.xml e passe os arquivos que sofreram modificações para o WebService fazer a atualização. Recomendo você fazer o Download do PhotoVision http://msdn.microsoft.com/smartclient/code...les/fotovision/ que é uma aplicação SmartClient Open Source da MS que usa MetaDados para armazenar informações e faz a atualização poe WebService também. Espero ter ajudado um pouco . []'s Rodrigo Glauser Compartilhar este post Link para o post Compartilhar em outros sites