2010-09-15 39 views
1

我有7个MySQL表,其中包含大约17000行中的部分重叠和冗余数据。所有表格都包含学校的名称和地址。有时候同一所学校的名字略有不同,有时同一所学校会出现在多个表格中,同样的名称或地址也会有细微差别。帮助正常化数据库的建议和工具

我的任务是创建一个带有ID,名称和城镇/城市ID字段的表,其中将包含来自7个表的数据。将有一个单独的表为id和名称字段的城镇。

由于原始表格没有用于城市的单独字段这一事实使其变得复杂,因此必须从具有非常不同格式的数据的地址字段中提取。

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

  • 你将如何开始这样的任务?什么是智能策略尽可能多地实现自动化?
  • 有没有可以提高速度的工具?比如可以比较字符串的东西,确定他们的“相似性”并提出可能的重复?

谢谢!

回答

2

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

维基百科有lists of schools pretty much all over the world,但唉,不适用于匈牙利。这很遗憾,因为最好是在系统中拥有应该拥有的数据列表,而不是试图从断开的数据库中重建它。如果你能得到这样的清单,那么你可以比较你的记录而不是相互比较,这将是有用的。即使你可以掌握仍然有用的邮政编码和城市名称列表。

说到模糊匹配字符串,有一些统计技巧可用。常见的是Levenshtein距离。这给出指示两个字符串之间的相似性的分数,表示为从字符串A到字符串B(AKA编辑距离)获得的变化的数量。 Code Janitor有一个针对MySQL的实现,但这仅仅是Google的热门应用,并且没有我的保证。 Find it here。 Jaro Winkler是另一种匹配算法,但在互联网上似乎有更少的实现。

一般加工暗示

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

谢谢你的出色建议!我写了一个快速perl脚本从教育部网站下载所有匈牙利学校的列表,并从数据中生成sql插入语句。这为我节省了大约2周的时间。再次感谢!! – neo2862 2010-09-16 10:03:35