0

Je travaille sur une application Compact Framework fonctionnant sous Windows Mobile. Il doit être utilisé par les chauffeurs de livraison pour leur dire leur prochain travail et suivre les dépenses, etc. J'ai une base de données SQL CE sur les appareils mobiles et SQL Server sur le serveur. Après avoir lutté avec des problèmes majeurs de performances et de configuration avec Sync Framework, j'ai fini par écrire mon propre code de synchronisation en utilisant WCF. Cela fonctionne bien et est beaucoup plus rapide que Sync Framework, mais on m'a demandé de l'accélérer davantage. Maintenant, nous entrons dans les détails du problème. J'espère pouvoir l'expliquer clairement.Conception de base de données et d'application - suppression des contraintes?

La synchronisation fonctionne une table à la fois et est seulement unidirectionnelle. Les mises à jour sont envoyées du serveur au PDA uniquement. Les données renvoyées au serveur sont traitées de manière complètement différente. Tout d'abord, je supprime tous les enregistrements sur le PDA qui ont été supprimés du serveur. En raison des contraintes de la base de données, je dois supprimer des tables 'child' avant de les supprimer des tables 'parent', donc je travaille sur l'heirachy à partir du bas. PAR EXEMPLE. Je supprime les enregistrements de la table des factures avant de les supprimer de la table des produits.

Ensuite, j'ajoute de nouveaux enregistrements au PDA qui ont été ajoutés sur le serveur. Dans ce cas, je dois d'abord mettre à jour les tables parentes et travailler sur heirachy et mettre à jour les tables enfant plus tard. Le problème est que mon patron n'aime pas le fait que mon application gardera une grande table comme la table des produits synchronisée avec le serveur lorsque le pilote de livraison n'a besoin que de la table invoiceProduct . La table invoiceProduct relie la table des factures et des produits et contient des informations sur le produit. Je veux dire que leur conception de base de données n'est pas normalisée et que le nom du produit a été dupliqué et stocké dans la table invoiceProduct ainsi que dans la table des produits. Bien sûr, nous savons tous que c'est une mauvaise conception, mais il semble qu'ils l'ont fait pour améliorer les performances dans ce type de situations.

La solution évidente consiste à supprimer complètement la table des produits de la base de données PDA. Cependant je ne peux pas faire cela parce que c'est parfois nécessaire. Les conducteurs ont la possibilité d'ajouter un nouveau produit à une facture à la volée. Mon patron suggère qu'ils pourraient simplement synchroniser la grande table de produits de temps en temps ou quand ils essaient d'ajouter un produit et constater qu'il n'est pas là. Cela ne fonctionnera pas avec la conception actuelle si une facture est téléchargée contenant un nouveau produit qui n'est pas sur le PDA, il va lancer une erreur de clé étrangère de base de données.

Désolé de poster un message aussi volumineux. J'espère que cela a du sens. Je ne veux pas supprimer mes contraintes de base de données et gâcher ma belle structure de données :(

+0

Pourquoi la résistance à la synchronisation de la table des produits? –

+0

... Et, pourriez-vous sortir avec seulement avoir (et synchronisation) partie de la table des produits (juste quelques-unes des colonnes)? –

Répondre

1

Vous semblez rencontrer un problème d'architecture. J'ai eu une application client-serveur où le client a chargé trop de données qui ne sont pas nécessaires

Nous avons utilisé ADO.NET (Dataset) pour refléter ce que la base de données a du côté client. Dataset La classe est comme une mémoire CE SQL Server. Notre société commence à avoir de plus gros clients et notre architecture n'est pas assez rapide pour gérer toutes les données.

Dans le passé, nous avons fait ce qui suit.Ce sont pas de solution rapide:

  1. Retirez le « plus » des contraintes du côté client
    • toutes les données fréquemment utilisées ont toujours contrainte dans l'ensemble de données .
  2. Créez une logique pour charger un sous-ensemble de données, au lieu de tout charger sur le client. Par exemple, nous ne chargeons que 7 jours de données de travail au lieu de toutes les données de travail (ce que nous avons fait par le passé). Dénormalisation de certaines données en ajoutant de nouvelles colonnes, pour ne pas avoir à charger des données supplémentaires dont nous n'avons pas besoin
  3. Certaines données ne sont chargées que lorsqu'elles sont nécessaires en fonction des modules clients.

Tant que vous conservez votre contrainte de base de données sur SQL Server, vous ne devriez avoir aucun problème d'intégrité des données. Cependant, du côté de votre PDA, vous devrez effectuer d'autres tests pour vous assurer que votre application fonctionne correctement.

Ce problème n'est pas facile à résoudre lorsque vous avez déjà une architecture existante. J'espère que ces suggestions vous aideront.

+0

Merci pour les suggestions Dsum. Il y a beaucoup de bonnes idées là-dedans. Je vais optimiser toutes les autres parties du code de synchronisation et ne faire que certaines de ces choses si je n'ai pas le choix. –

1

Ajouter un champ created_on pour vos produits et de garder une trace du moment où la dernière fois que chaque PDA synchronisé.Lorsque la facture est téléchargée, vérifiez si le produit est plus récent que la dernière synchro et s'il resynchronise le pda, ne semble-t-il pas trop bousiller le DB?

+0

Merci Nate - pas une mauvaise suggestion. Cela nécessiterait encore un peu de travail. Je vais le garder à l'esprit. –

Questions connexes