IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Synchronisation données (BDD + Serialization)


Sujet :

C#

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Synchronisation données (BDD + Serialization)
    Bonjour, j'ai un projet à fournir pour l'école et je bloque sur un principe conceptuel (pas technique).

    Voici le contexte
    : Les commerciaux de ma société travaillent "offline" et ont la possibilité de synchroniser leur travail (le soir chez eux en se connectant sur le vpn de l'entreprise par exemple)

    Il y'a donc une base de données dans les locaux de l'entreprise, et les commerciaux récupère les infos de la base de données pour les sérialiser ensuite afin d'y accéder "offline"
    Pour faire très simple il y'a 2 tables dans cette base de données :
    * Table Société : Cette table contient la liste des clients (id auto incrément, nom de la société, adresse et puis voilà)
    * Table Contact : Cette table contient la liste des contacts des Sociétés (id auto incrément, nom, prénom, email, clef étrangère id société et puis voilà), 1 Société peut avoir 0 ou plusieurs contacts

    Actuellement je sais interroger la base de données et placer mes enregistrements dans des objets (via Linq entre autre).
    Je sais sérializer mes objets de manière à pouvoir consulter la liste des société et contact "offline", depuis les fichiers sérializé.

    Mais il y'a un endroit où je bloque. Admettons que mes commerciaux ajoutent (en offline) une Société et un Contact à cette société. Dans la table Société j'aurais un ID de société, et dans la table contact, le contact pointera vers l'ID de la société. Au moment de "pousser" les données vers la base de données en ligne .... que se passe-t-il si entre temps un autre de mes commerciaux à ajouté lui aussi une Société (qui donc utilise le même ID) ? Il y aura un problème forcément.

    Comment géreriez vous la remontée d'information ?

    Je suis à votre écoute.

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Pour éviter les conflits, on peut attribuer des plages d'ID différentes à chaque commercial.

    La gestion des autoincrément étant variable, quel est le SGBD utilisé ?

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Je ne connaissais pas cette fonctionnalité, tu me l'apprends.

    Le SGBD est libre, mais je t'avoue que j'ai pris un MySql pour éviter d'installer un truc lourdingue (genre MsSql) sur mon pc.
    Les connecteurs et le Framework Entity semble bien fonctionner avec MySql

    Mais sinon je reste ouvert (on peut même utiliser Access)

    Sinon javais penser pusher mes objets Société avec une boucle et au sein de la boucle aller chercher le/les objets Contacts liés à la Société et modifier l'idSociete à la volée ...

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Hypothèses:
    • les utilisateurs off-line se connectent à un SGBD local sur leur PC qui contient la copie de la base remote,
    • on a un maximum de N utilisateurs (N-1 utilisateurs offline et 1 pour tous les Online).


    Une solution pour des SGBD qui ne permettent pas de gérer "manuellement" les valeurs des champs auto-incrément (ce n'est pas le cas de My-SQL) :

    • On attribue à chaque utilisateur n° U de 0 à N-1 (U=0 à N-2 pour les N-1 offline, U=N-1 pour les online).
    • Dès qu'un utilisateur U, lance l'application en mode Offline :


    1. on recherche la valeur max Mx dans les colonnes auto-incrément "Idx" des différentes tables , via la commande : SELECT MAX(Idx) FROM tblx,
    2. on définit l'offset Offx = M+X de la plage utilisable en offline pour la table tblx en laissant X auto-increment disponibles pour les utilisateurs on-line de la table,
    3. on ajuste Offx de façon à ce que : Offx modulo N = U,
    4. on execute une commande SQL pour changer l'offset de l'autoincrement de chaque table : (en MySQl : ALTER TABLE tblx AUTO_INCREMENT=Offx)
    5. on execute une commande SQL pour changer le pas de l'auto-increment des tables (en MySQL : SET GLOBAL auto_increment_increment=N )


    Si N=10 (10 commerciaux) et un max de 1000 insertions online avant une resynchronisation, une resynchronisation après 5 insertions offline augmentera environ l'offset de 1000+5*10 (au lieu de 5 en online).
    Donc le nombre d'insertions max sera globalement limité à 4 millions (au lieu de 4 milliards) avant réorganisation.

    Pour My-SQL, on peut simplifier un peu puisqu'on peut définir la valeur du champ auto-incrément lors de l'insertion:
    Dans la bases online, on définit une fois pour toutes le pas et l'offset de l'auto-increment des tables : SET GLOBAL auto_increment_Offset=N et SET GLOBAL auto_increment_increment=N
    Dans la gestion des bases offline, il suffit de définir explicitement à chaque insertion dans une table la valeur du champs auto-incrément à une valeur V supérieure à MAX(Idx) et telle que V modulo N = U,

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 243
    Points : 328
    Points
    328
    Par défaut
    Bonjour,

    J'ai eu à gérer un cas similaire (avec synchro. bi-directionnelle dans mon cas) en vb6 donc sans mécanisme de sérialization automatique. Chaque table possédait bien une clef primaire en auto-incrément mais aussi une colonne de type GUID qui servait elle à éviter les collisions (j'aurais pu me passer de l'auto-incrément mais c'est plus simple de retenir, lire ou comparer un long qu'un GUID en débogage .

    Lors de la synchro, ce qui comptait était le GUID, ce qui simplifiait la gestion des ajout/maj :
    * il n'y a pas d'enreg dans la base "destination" ayant le même GUID que celui que je viens de lire dans le "fichier" de synchro. : c'est un nouveau (donc ajout d'un enreg avec son propre auto-incrément mais en conservant le GUID)
    * il y a déjà un enreg dans la base "destination" ayant le même GUID que celui que je viens de lire dans le "fichier" de synchro. : c'est une MAJ (ou une suppression si un flag "delete" était à vrai).

    Pour gérer et conserver les relations, lors de la génération du fichier, je remplaçait à la volée la valeur du champ Auto-incrément par le GUID et inversement, lors de l'import, l'application récupérait l'ID correspondant au GUID.

    Un inconvénient est qu'au fur et à mesure, les bases étaient différentes au niveau des auto-incréments mais les GUID et les autres colonnes étant synchro., ce n'était pas plus grave que ça. Et au pire, les commerciaux pouvaient repartir avec une copie de la base "centrale" quand ils revenaient dans les locaux.

    mes 2 cents

Discussions similaires

  1. Stockage de données HSQLDB hors ligne et synchronisation avec BDD principale
    Par merlin1977 dans le forum Persistance des données
    Réponses: 7
    Dernier message: 26/02/2015, 15h48
  2. [VB.Net] Comment récupérer dans un textbox une donnée BDD ?
    Par zzzmoi dans le forum Accès aux données
    Réponses: 10
    Dernier message: 08/07/2007, 02h08
  3. Réponses: 2
    Dernier message: 04/06/2006, 20h11
  4. Réponses: 7
    Dernier message: 24/02/2006, 12h32
  5. [Hibernate]Accès aux données BDD via Hibernate
    Par LESOLEIL dans le forum Hibernate
    Réponses: 8
    Dernier message: 17/05/2005, 20h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo