Советы и инструменты, которые помогут нормализовать базу данных - PullRequest
1 голос
/ 15 сентября 2010

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

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

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

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

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

Спасибо!

1 Ответ

2 голосов
/ 15 сентября 2010

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

В Википедии есть списки школ по всему миру , но, увы, не для Венгрии.Это жаль, потому что было бы лучше иметь список данных, которые вы должны иметь в своей системе, а не пытаться восстановить их из ваших сломанных баз данных.Было бы полезно, если бы вы могли получить такой список, чтобы вы могли сравнить свои записи с ним, а не друг с другом.Даже если вы можете просто получить списки почтовых индексов и названий городов, которые все равно помогут.

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

Общие рекомендации по обработке

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