帮助规范化数据库的建议和工具

时间:2010-09-15 09:28:46

标签: database automation normalization deduplication

我有7个MySQL表,其中包含大约17000行的部分重叠和冗余数据。所有表格都包含学校的名称和地址。有时,同一所学校在一个名称略有不同的表格中重复出现,有时同一所学校会出现在多个表格中,而且名称或地址的差异也很小。

我的任务是创建一个包含id,name和town / city id字段的表,其中包含7个表中的数据。对于具有id和name字段的城镇,将有一个单独的表。

由于原始表没有单独的城市字段,因此必须从具有截然不同格式的数据的地址字段中提取这一事实,这很复杂。

我意识到大部分必须手动完成,我已经硬化了我的灵魂,我已经准备好应对这将带给我的生活地狱。我的问题是:

  • 你将如何开始这样的任务?什么是尽可能自动化的智能策略?
  • 有没有可用的工具可以加快速度?喜欢可以比较字符串的东西,确定它们的“相似性”并建议可能的重复吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

虽然使用的是Oracle而不是MySQL,但我做过一次这样的事情。 17000条记录是可管理的记录数量,但足以使其值得构建工具。

维基百科有lists of schools pretty much all over the world,但不是匈牙利。这是一个遗憾,因为最好在系统中包含您应该拥有的数据列表,而不是尝试从破碎的数据库中重建它。如果您可以获得这样的列表,那么您可以将您的记录与其进行比较,而不是相互比较,这将非常有用。即使您可以获得仍然有用的邮政编码和城市名称列表。

当谈到模糊匹配字符串时,有许多统计技巧可用。一个常见的是Levenshtein距离。这给出了一个分数,表示两个字符串之间的相似性,表示为从字符串 A 到字符串 B (AKA编辑距离)所需的更改次数。 Code Janitor有一个针对MySQL的实现,但这只是谷歌的热门产品,并且没有我的保证。 Find it here。 Jaro Winkler是另一种匹配算法,但似乎有更少的实现在互联网上发挥作用。

一般处理提示

  • 将所有学校名称和地址提取到一个表中,元数据指示每行的出处(数据库,表,主键)。
  • 添加列以保存搜索字符串,以获取学校名称和地址。例如,有一列可以删除标点符号和数字(在某些匹配算法中,THMAS比TH0MAS更接近于THOMAS)。
  • 在另一列允许常见拼写错误(在英国地址中,字符串SW!^可能代表SW16,Streatham的邮政编码)。
  • 在这些搜索列上构建FullText索引,以帮助选择城市名称等常见单词的出现次数。
  • 如果你有大量的数据和耐心,建立一个词库以识别像Rd,St,Blvd这样的常见收缩可能是一个有用的练习,但它可能不值得17000行。
  • 使用正则表达式匹配模式,例如邮政编码。