SQL和模糊比较

时间:2013-04-03 23:12:43

标签: mysql sql select fuzzy-logic fuzzy-comparison

假设我们有一个人员表(姓名,地址,SSN等)。

我们希望找到所有"非常相似的行"指定的人A. 我想实现某种模糊逻辑比较A和表People的所有行。将有几个模糊推理规则分别在几个列上工作(例如3个名称的模糊规则,2个姓氏规则,5个地址规则)

问题是以下哪两种方法会更好?为什么?

  1. 将所有模糊规则实现为存储过程,并使用一个重的SELECT语句返回所有非常相似的行"到A.这种方法可能包括使用soundex,sim metric等。

  2. 实现一个或多个简化的SELECT语句,返回不太准确的结果,"相似的"到A,然后模糊比较A和所有返回的行(外部数据库)以得到非常相似的"行。因此,模糊的比较将以我最喜欢的编程语言实现。

  3. 表人们应该有多达500k行,我想每天制作大约500-1000个这样的查询。我使用MySQL(但这还有待考虑)。

4 个答案:

答案 0 :(得分:3)

我真的不认为有明确的答案,因为它取决于问题中没有的信息。无论如何,评论太长了。

DBMS擅长根据索引检索信息。让db服务器在繁重的计算中浪费时间是没有意义的,除非它专门用于这个特定的目的(由@Adrian回答)。

因此,您的客户端应用程序应该委托DBMS检索规则所需的信息。

如果计算较小,则可以在服务器上完成所有计算。否则,将其拉入客户端系统。

第二种方法的缺点在于从服务器传输到客户端的数据量以及要建立的连接数。因此,通常它是服务器中计算和数据传输之间的折衷。根据模糊规则的具体情况实现平衡。

编辑:我在评论中看到您几乎肯定必须在客户端中实现代码。在这种情况下,您应该考虑一个额外的标准,代码位置,用于维护目的,即尝试将所有相关的代码放在一起,而不是在系统(和语言)之间传播。

答案 1 :(得分:2)

我会说你最好使用简单的选择来获得最接近的匹配,而不需要锤击数据库,然后在应用程序层中进行繁重的工作。我建议这个解决方案的原因是可扩展性:如果你在应用程序层中做了大量工作,那么你的问题就是map-reduce风格解决方案的完美用例,你可以在各个节点之间分配相似性处理并获得结果回来比你通过数据库快得多;另外,这样一来,你就不会锁定你的数据库并减慢同时可能正在进行的任何其他操作。

答案 2 :(得分:1)

因为你还在考虑使用什么数据库,PostgreSQL有fuzzystrmatch模块提供Levenshtein和Soundex函数。此外,您可能希望按照here所述查看pg_trm模块。也许您也可以使用soundex()将索引放在列上,这样您就不必每次都计算。 但是你似乎过早地进行了优化,所以我的建议是使用pg测试,然后想知道你是否需要优化,你提供的数字真的看起来并不是很多,因为你几乎有两分钟时间来运行一个查询。 / p>

答案 3 :(得分:0)

我要考虑的一个选项是在“People Talbe”中添加一个列,该列是该人的SoundEx值。

我已经使用

完成了联接
Select [Column}
From People P 
    Inner join TableA A  on Soundex(A.ComarisonColumn) = P.SoundexColumn

这将返回TableA中与People Tables SoundEx列具有相同SoundEx值的任何内容。

我没有对那些大小的表使用那种查询,但我发现没有尝试它的问题。您还可以索引SoundExColumn以帮助提高性能。