一个设计和优化的问题(江湖告急)

时间:2022-10-01 16:07:16
现在正在做一个项目,要完成大数据量的比对。比对的基本思路是这样的:给需要比对的字段设定一个全值,比对开始后遍历数据,将符合条件的记录进行权值累加。例如我要比对一个犯罪人员,设定如果身份证号相符的正确率为90%,则我将权值设为9,姓名的权值设为2等等。比对开始后,首先用身份证号遍历表中的数据,将身份证号相同的记录得到并插入到一个临时表中,这个临时表没有主键,当需要比对的字段遍历完之后,再SUM临时表中的记录,得到阈值>100的记录。
看起来,这是一个很笨的方法,现在紧急求助对此类比对问题的解决方案和优化方法。高手们给给意见。我在线等待!!!

7 个解决方案

#1


我觉得如果仅仅是这点要求的话,可以用一句sql完成,为什么要搞得这么复杂?

#2


因为数据库是分布的,*系统的,兼顾原来的设计,很多东西不是想写SQL就可以的。现在只能秀秀补补。所以还是得用SQL.操作有些地方是异地异步的。所以还是要用存储过程。

#3


你说的太笼统了,很难理解。能不能举一些实际的例子来讨论。

#4


好的,例如*系统现在要通缉一个人,这个人可能在本地的犯罪人员信息库里面有记载,也可能在本地*系统的暂住人口库里面有记载,也可能在本地的旅馆业的住宿登记数据库中有记载。现在要对这个嫌疑人员进行布控。就要对这些可能记载有嫌疑人信息的数据库进行扫描。还有一种正向的情况,当本地一个暂住人口到派出所登记,派出所要对登记人员进行一个非实时的遍历比对。看他是否在本地犯罪信息库里面有记录。
由于人员登记的项目还是比较多的,如姓名、身份证号、性别、年龄、民族等等。为了得到比较精确的结果。就给这些公共的字段赋予不同的权值,比如身份证号的匹配度就很高,我们把权值设为9,民族的权值较低,我们设成1。如果所有的条件组合比对后,得到的阈值大于11,我们就认为这条记录的可能性比较大,我们就把这样的记录作为比对结果。
现在我们是这样的,当在保存一条这样的登记记录后,触发器调用比对库的存储过程,存储过程的运行机制是这样的:先进行初始化和一些设定以及数值合法性检验,然后对每个有权值的字段进行遍历。如果匹配,将这条记录以及相应权值记录到一个临时表里面。当所有的有权值的字段遍历完后(例如首先遍历身份证号这个字段,然后遍历姓名这个字段),再对临时表中的数据进行处理,将业务表中主键相同的记录项的权值相加,得到的权值如果大于阈值,则将这样的记录放在比对结果表中。很笨笨的。

#5


我觉得可以用全文索引。

#6


恩,象按扭说的那样使用全文索引来处理!

#7


在你的触发器中把当前录入的记录的字段传递给你的比对存储过程。
 如:
   当前插入一条记录:
自增字段 姓名(权值2)     身份证   民族(权值0)
  1      刘建军   123      汉

然后在你的比对存储过程中
create proc procname
  @cname char(8),@csfzhm char(18),@total int
as 
  if exist(select name from (select 自增字段,name from 本地库 unoin select 自增字段,name from 暂住) where 自增字段<>@@identity and name=@cname)
     set @total=2 
  if exist(select sfzhm from (select 自增字段,sfzhm from 本地库 unoin select 自增字段,csfzhm from 暂住) where 自增字段<>@@identity and sfzhm=@csfzhm)
     set @total=@total+9

 ……
 if @total>=11
    insert tablename() select fieldlist from 档案表 where 自增字段=@@identity 

#1


我觉得如果仅仅是这点要求的话,可以用一句sql完成,为什么要搞得这么复杂?

#2


因为数据库是分布的,*系统的,兼顾原来的设计,很多东西不是想写SQL就可以的。现在只能秀秀补补。所以还是得用SQL.操作有些地方是异地异步的。所以还是要用存储过程。

#3


你说的太笼统了,很难理解。能不能举一些实际的例子来讨论。

#4


好的,例如*系统现在要通缉一个人,这个人可能在本地的犯罪人员信息库里面有记载,也可能在本地*系统的暂住人口库里面有记载,也可能在本地的旅馆业的住宿登记数据库中有记载。现在要对这个嫌疑人员进行布控。就要对这些可能记载有嫌疑人信息的数据库进行扫描。还有一种正向的情况,当本地一个暂住人口到派出所登记,派出所要对登记人员进行一个非实时的遍历比对。看他是否在本地犯罪信息库里面有记录。
由于人员登记的项目还是比较多的,如姓名、身份证号、性别、年龄、民族等等。为了得到比较精确的结果。就给这些公共的字段赋予不同的权值,比如身份证号的匹配度就很高,我们把权值设为9,民族的权值较低,我们设成1。如果所有的条件组合比对后,得到的阈值大于11,我们就认为这条记录的可能性比较大,我们就把这样的记录作为比对结果。
现在我们是这样的,当在保存一条这样的登记记录后,触发器调用比对库的存储过程,存储过程的运行机制是这样的:先进行初始化和一些设定以及数值合法性检验,然后对每个有权值的字段进行遍历。如果匹配,将这条记录以及相应权值记录到一个临时表里面。当所有的有权值的字段遍历完后(例如首先遍历身份证号这个字段,然后遍历姓名这个字段),再对临时表中的数据进行处理,将业务表中主键相同的记录项的权值相加,得到的权值如果大于阈值,则将这样的记录放在比对结果表中。很笨笨的。

#5


我觉得可以用全文索引。

#6


恩,象按扭说的那样使用全文索引来处理!

#7


在你的触发器中把当前录入的记录的字段传递给你的比对存储过程。
 如:
   当前插入一条记录:
自增字段 姓名(权值2)     身份证   民族(权值0)
  1      刘建军   123      汉

然后在你的比对存储过程中
create proc procname
  @cname char(8),@csfzhm char(18),@total int
as 
  if exist(select name from (select 自增字段,name from 本地库 unoin select 自增字段,name from 暂住) where 自增字段<>@@identity and name=@cname)
     set @total=2 
  if exist(select sfzhm from (select 自增字段,sfzhm from 本地库 unoin select 自增字段,csfzhm from 暂住) where 自增字段<>@@identity and sfzhm=@csfzhm)
     set @total=@total+9

 ……
 if @total>=11
    insert tablename() select fieldlist from 档案表 where 自增字段=@@identity