2010-09-15 20 views
1

J'ai 7 tables MySQL qui contiennent des données redondantes et partiellement chevauchantes sur environ 17 000 lignes. Tous les tableaux contiennent les noms et adresses des écoles. Parfois, la même école est dupliquée dans une table avec un nom légèrement différent, et parfois la même école apparaît dans plusieurs tables, encore une fois, avec de petites différences dans son nom ou son adresse.Conseils et outils pour normaliser une base de données

Ma tâche consiste à créer une seule table avec un ID, un nom et un champ ID de ville/ville qui contiendraient les données des 7 tables. Il y aura un tableau séparé pour les villes avec un champ identifiant et nom. Ceci est compliqué par le fait que les tables d'origine n'ont pas de champ séparé pour la ville, il doit être extrait du champ d'adresse qui a des données dans des formats très différents.

Je me rends compte que la plupart de ceci doit être fait manuellement, j'ai durci mon âme et je suis prêt à faire face à l'enfer vivant que cela m'apportera. Mes questions sont:

  • Comment débuteriez-vous une telle tâche? quelle serait une stratégie intelligente pour en automatiser autant que possible?
  • Y a-t-il des outils disponibles qui pourraient accélérer les choses? comme quelque chose qui peut comparer les chaînes, déterminer leur «ressemblance» et suggérer des duplications possibles?

Merci!

Répondre

2

J'ai fait quelque chose comme ça une fois, mais en utilisant Oracle plutôt que MySQL. 17000 enregistrements est un nombre gérable d'enregistrements mais suffisant pour rendre les outils de construction utiles.

Wikipedia a lists of schools pretty much all over the world, mais hélas pas pour la Hongrie. C'est dommage, car il serait préférable d'avoir la liste des données que vous devriez avoir dans votre système plutôt que d'essayer de le reconstruire à partir de vos bases de données fracturées. Il serait utile si vous pouvez obtenir une telle liste afin que vous puissiez comparer vos enregistrements plutôt que les uns contre les autres. Même si vous pouvez simplement obtenir des listes de codes postaux et de noms de villes qui aideraient encore.

En ce qui concerne les chaînes de correspondance floue, il existe un certain nombre d'astuces statistiques disponibles. Une commune est la distance de Levenshtein. Cela donne un score indiquant la similarité entre deux chaînes, exprimée comme le nombre de changements nécessaires pour obtenir de la chaîne A à la chaîne B (distance d'édition AKA). Code Janitor a une implémentation pour MySQL mais ce n'est que le top hit de Google, et ne vient pas avec une garantie de ma part. Find it here. Jaro Winkler est un autre algorithme de correspondance, mais il semble y avoir moins d'implémentations sur Internet.

traitement Recommandations générales

  • Extrait tous les noms et adresses des écoles en une seule table, avec des métadonnées indiquant la provenance de chaque ligne (base de données, table, clé primaire).
  • Ajoutez des colonnes pour contenir les chaînes de recherche, pour le nom et l'adresse de l'école. Par exemple, avoir une colonne qui supprime la ponctuation et les nombres (dans certains algorithmes correspondants, THMAS est plus proche de THOMAS que TH0MAS).
  • Dans une autre colonne permettre les fautes de frappe courantes (dans une adresse britannique, une chaîne SW!^Est susceptible de représenter SW16, le code postal de Streatham).
  • Créez des index FullText sur ces colonnes de recherche pour faciliter la sélection des occurrences de mots courants, tels que les noms de villes.
  • Si vous aviez une énorme quantité de données et de la patience, la construction d'un thesaurus pour identifier les contractions communes comme Rd, St, Blvd pourrait être un exercice utile, mais cela ne vaut probablement pas pour 17000 lignes.
  • Utilisez regex pour faire correspondre les modèles, tels que les codes postaux.
+0

Merci pour cet excellent conseil! J'ai écrit un script perl rapide pour télécharger une liste de toutes les écoles hongroises sur le site Web du ministère de l'Éducation et générer des instructions d'insertion sql à partir des données. Cela m'a sauvé environ 2 semaines. Merci encore!! – neo2862