2010-01-20 3 views
0

Ok, voyons si vous pouvez m'aider avec ce problème, je me bats la tête.Synchroniser efficacement les informations de l'entrepôt

Le scénario est une configuration assez standard avec un point de vente (c'est où je suis) et un backoffice gardant la trace des informations d'entrepôt. Le problème est que j'ai besoin de synchroniser la base de données au point de vente avec les informations de stock actuelles du backoffice. En ce moment, cela se fait en récupérant un catalogue à partir du backoffice via le Web. Le catalogue contient des informations telles que les unités actuellement disponibles, le prix actuel et les identifiants uniques pour chaque type. Dans ma base de données j'ai exactement la même information et je la mets à jour après avoir récupéré le catalogue. Il est important pour moi d'insérer de nouveaux types d'unités telles qu'elles apparaissent, de mettre à jour les types déjà existants avec les informations de disponibilité et de prix, et enfin de supprimer les types (ou de les marquer indisponibles).

L'implémentation actuelle marque simplement tous les éléments comme indisponibles au cas où ils ont été retranchés du catalogue, puis pour chaque élément dans le catalogue émet une requête comme ceci:

INSERT INTO store (id, quantity, price)VALUES(x, y, z) 
ON DUPLICATE KEY quantity=y, price=z; 

L'id est défini comme unique pour éviter dupliquer les données obsolètes dans la base de données et provoquer une collision qui déclenche la mise à jour à la place. Le problème principal est que cela génère une requête pour chaque type dans le catalogue, qui peut se développer rapidement.

Y at-il une solution plus rapide à ce problème?

+0

Le serveur frontal se connecte-t-il directement à la base de données du backoffice ou à un service Web de type XML? – MindStalker

+0

Cela passe par une interface Web simple, avec une syntaxe de sortie vraiment stupide, mais je peux l'analyser correctement. – cdecker

Répondre

1
REPLACE INTO store (id, quantity, price) VALUES (x, y, z), (x2,y2,z2); 

Je voudrais aussi suggère de ne pas les envoyer à l'webapp comme SQL (sécurité horribles) et de les envoyer en grand batchs (1000 lignes à la fois) dans un format à l'aise avec votre. La webapp fait toutes les déclarations REPLACE et renvoie le succès.

+0

C'est aussi proche qu'il pourrait obtenir :-) Malheureusement, je n'ai pas à dire à quoi l'interface entre les bureaux devrait ressembler, sinon je laisserais seulement les mises à jour sont expulsés du backoffice à moi. Les données sont un étrange fichier délimité par des barres, ce qui ne serait pas si grave si elles ne concaténaient pas des lignes utilisant des tuyaux, ce qui obligeait à compter les éléments pour savoir dans quel enregistrement nous sommes :-( – cdecker

0

INSERT INTO store (id, quantity, price) VALUES (x, y, z), (x2,y2,z2)

Mais je ne sais pas comment cette jives avec votre déclaration ON DUPLICATE KEY ... vous pouvez effectuer une certaine logique pour diviser les données en groupes pour mettre à jour et insérer de manière indépendante.

+0

L'ON DUPLICATE s'effondrera avec des insertions multi-lignes, je pourrais essayer d'aller chercher les IDs en premier mais cela augmenterait simplement la charge sur ma DB, n'est-ce pas? – cdecker

+0

Eh bien, cela dépend du nombre d'articles dont nous parlons, mais en supposant que vous sélectionnez sur la clé primaire et ne renvoyez qu'une seule colonne, je ne pense pas que ce serait horrible. Mais je pense que vous allez avoir à faire une grande lecture et ensuite les trier à l'avance afin de faire multi-insertion ou votre devoir d'insérer les uns à la fois avec le basculement automatique de mise à jour pour les enregistrements existants. – prodigitalson

Questions connexes