2017-09-18 5 views
0

J'ai des clients et des prospects provenant de différentes sources et j'ai besoin de savoir si le client est déjà enregistré en tant que lead.Correspondance de données MySQL: de meilleures options?

J'utilise 12 champs pour la correspondance:

address1_clear 
address2_clear 
address_clear 
contact_name_clear 
email 
invoice_mobile 
invoice_phone 
mobile 
name_clear 
phone 
phone2 
taxnum 

(_clear suffixe signifie que les données sont en minuscules, w/o espace blanc et la ponctuation).

  • conduit - 300k records
  • clients - 500k records
  • customers_leads - 460K enregistre

C'est la requête utilisée pour effectuer une correspondance:

SELECT l.id as lead_id, c.id as customer_id FROM lead l 
INNER JOIN sync_settings s ON s.account_id = l.account_id 
INNER JOIN customers c ON c.setting_id = s.id 
LEFT JOIN customers_leads cl ON cl.customer_id = c.id AND cl.lead_id = l.id 
WHERE cl.lead_id IS NULL AND 
(
    (l.phone IS NOT NULL AND l.phone IN (c.phone, c.phone2, c.invoice_phone, c.invoice_mobile)) OR 
    (l.mobile IS NOT NULL AND l.mobile != "" AND l.mobile IN (c.phone, c.phone2, c.invoice_phone, c.invoice_mobile)) OR 
    (l.invoice_phone IS NOT NULL AND l.invoice_phone != "" AND l.invoice_phone IN (c.phone, c.phone2, c.invoice_phone, c.invoice_mobile)) OR 
    (l.invoice_mobile IS NOT NULL AND l.invoice_mobile != "" AND l.invoice_mobile IN (c.phone, c.phone2, c.invoice_phone, c.invoice_mobile)) OR 
    (l.email IS NOT NULL AND l.email != "" AND l.email = c.email) OR 
    (l.taxnum IS NOT NULL AND l.taxnum != "" AND l.taxnum = c.taxnum) OR 
    (l.contact_name_clear IS NOT NULL AND l.contact_name_clear != "" AND l.contact_name_clear = c.contact_name_clear) OR 
    (l.address1_clear IS NOT NULL AND l.address1_clear != "" AND l.address1_clear = c.address_clear) OR 
    (l.address2_clear IS NOT NULL AND l.address2_clear != "" AND l.address2_clear = c.address_clear) OR 
    (l.name_clear IS NOT NULL AND l.name_clear != "" AND l.name_clear IN (c.contact_name_clear, c.name_clear)) 
) 

Il est super lourd , le temps de réponse est ~ 4 minutes. L'indexation n'a pas beaucoup aidé à cause des OR et des conditions supplémentaires.

Je voudrais savoir: existe-t-il une meilleure façon de le faire? Peut-être en utilisant une base de données NoSQL pour construire une énorme table de hachage essentiellement ou une technique de correspondance de données que je ne pouvais pas google? Je suis conscient que je peux faire des tableaux séparés uniquement pour les champs correspondants et ce sera plus rapide, mais j'aimerais quand même connaître mes alternatives.

Répondre

0

Le problème que vous avez est appelé record linkage et il n'existe aucune solution de base de données qui résout nativement le problème.

Il existe un certain nombre de projets open source que vous pouvez utiliser, y compris Duke ou dedupe (je suis un auteur principal dedupe).

1

Un autre projet open source à prendre en compte est le recordlinkage (Python Record Linkage Toolkit). Le document documentation comprend une vue d'ensemble du processus de couplage d'enregistrements, des exemples de code des débutants et de la documentation API.