2010-09-15 5 views
1

У меня есть 7 таблиц MySQL, которые содержат частично перекрывающиеся и избыточные данные примерно в 17000 строк. Все таблицы содержат имена и адреса школ. Иногда одна и та же школа дублируется в таблице с немного другим именем, и иногда одна и та же школа появляется в нескольких таблицах, опять же, с небольшими различиями в ее имени или адресе.Советы и инструменты для нормализации базы данных

Моя задача - создать единую таблицу с идентификатором, именем и полем города/города, в котором будут содержаться данные из 7 таблиц. Будет отдельная таблица для городов с идентификатором и полем имени.

Это осложняется тем фактом, что исходные таблицы не имеют отдельного поля для города, его необходимо извлечь из поля адреса, в котором есть данные в совершенно разных форматах.

Я понимаю, что большую часть этого нужно сделать вручную, я ожесточил свою душу, и я готов бороться с живым адом, это навлечет на меня. Мои вопросы:

  • как бы вы начали такую ​​задачу? что было бы разумной стратегией для автоматизации как можно большего количества?
  • Есть ли какие-либо инструменты, которые могли бы сделать это быстрее? как что-то, что может сравнить строки, определить их «подобие» и предложить возможные дублирования?

Спасибо!

ответ

2

Я сделал что-то подобное, хотя и использовал Oracle, а не MySQL. 17000 записей - это управляемое количество записей, но достаточно, чтобы сделать его полезным инструментом построения.

Википедия имеет lists of schools pretty much all over the world, но, увы, не для Венгрии. Жаль, потому что было бы лучше иметь список данных, которые вы должны иметь в своей системе, а не пытаться восстановить его из ваших разбитых баз данных. Было бы полезно, если бы вы смогли получить такой список, чтобы сравнить свои записи с ним, а не друг против друга. Даже если вы можете просто получить списки почтовых индексов и названий городов, которые все равно помогут.

Когда речь заходит о нечетких строках соответствия, существует ряд статистических трюков. Обычным является расстояние Левенштейн. Это дает оценку, указывающую сходство между двумя строками, выраженное как количество изменений, необходимых для получения из строки A в строку B (расстояние редактирования AKA). Code Janitor имеет реализацию для MySQL, но это самый лучший хит в Google, и у меня нет никаких гарантий. Find it here. Jaro Winkler - еще один алгоритм сопоставления, но, похоже, в Интернете есть меньше реализаций.

Общая обработка подсказок

  • Распакуйте все имена и адреса школ в одну таблицу, с метаданными, указывающей происхождение каждой строки (базы данных, таблицы, первичный ключ).
  • Добавить столбцы для поиска строк поиска, для названия школы и адреса. Например, есть один столбец, который удаляет пунктировку и числа (в некоторых алгоритмах соответствия THMAS ближе к THOMAS, чем TH0MAS).
  • В другом столбце разрешены общие опечатки (в британском адресе строка SW!^Скорее всего будет представлять SW16, почтовый индекс для Streatham).
  • Постройте индексы FullText в этих столбцах поиска, чтобы помочь выявить появление общих слов, таких как названия городов.
  • Если у вас было огромное количество данных и какое-то терпение, создание тезауруса для определения общих сокращений, таких как Rd, St, Blvd, может быть полезным упражнением, но, вероятно, это не стоит 17000 строк.
  • Используйте регулярное выражение для соответствия шаблонам, таким как почтовые индексы.
+0

Благодарим вас за отличный совет! Я написал быстрый Perl-скрипт для загрузки списка всех венгерских школ с веб-сайта Министерства образования и создания SQL-записей вставки из данных. Это спасло меня около 2 недель. Еще раз спасибо!! – neo2862

Смежные вопросы