看起来,这是一个很笨的方法,现在紧急求助对此类比对问题的解决方案和优化方法。高手们给给意见。我在线等待!!!
7 个解决方案
#1
我觉得如果仅仅是这点要求的话,可以用一句sql完成,为什么要搞得这么复杂?
#2
因为数据库是分布的,*系统的,兼顾原来的设计,很多东西不是想写SQL就可以的。现在只能秀秀补补。所以还是得用SQL.操作有些地方是异地异步的。所以还是要用存储过程。
#3
你说的太笼统了,很难理解。能不能举一些实际的例子来讨论。
#4
好的,例如*系统现在要通缉一个人,这个人可能在本地的犯罪人员信息库里面有记载,也可能在本地*系统的暂住人口库里面有记载,也可能在本地的旅馆业的住宿登记数据库中有记载。现在要对这个嫌疑人员进行布控。就要对这些可能记载有嫌疑人信息的数据库进行扫描。还有一种正向的情况,当本地一个暂住人口到派出所登记,派出所要对登记人员进行一个非实时的遍历比对。看他是否在本地犯罪信息库里面有记录。
由于人员登记的项目还是比较多的,如姓名、身份证号、性别、年龄、民族等等。为了得到比较精确的结果。就给这些公共的字段赋予不同的权值,比如身份证号的匹配度就很高,我们把权值设为9,民族的权值较低,我们设成1。如果所有的条件组合比对后,得到的阈值大于11,我们就认为这条记录的可能性比较大,我们就把这样的记录作为比对结果。
现在我们是这样的,当在保存一条这样的登记记录后,触发器调用比对库的存储过程,存储过程的运行机制是这样的:先进行初始化和一些设定以及数值合法性检验,然后对每个有权值的字段进行遍历。如果匹配,将这条记录以及相应权值记录到一个临时表里面。当所有的有权值的字段遍历完后(例如首先遍历身份证号这个字段,然后遍历姓名这个字段),再对临时表中的数据进行处理,将业务表中主键相同的记录项的权值相加,得到的权值如果大于阈值,则将这样的记录放在比对结果表中。很笨笨的。
由于人员登记的项目还是比较多的,如姓名、身份证号、性别、年龄、民族等等。为了得到比较精确的结果。就给这些公共的字段赋予不同的权值,比如身份证号的匹配度就很高,我们把权值设为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
如:
当前插入一条记录:
自增字段 姓名(权值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,我们就认为这条记录的可能性比较大,我们就把这样的记录作为比对结果。
现在我们是这样的,当在保存一条这样的登记记录后,触发器调用比对库的存储过程,存储过程的运行机制是这样的:先进行初始化和一些设定以及数值合法性检验,然后对每个有权值的字段进行遍历。如果匹配,将这条记录以及相应权值记录到一个临时表里面。当所有的有权值的字段遍历完后(例如首先遍历身份证号这个字段,然后遍历姓名这个字段),再对临时表中的数据进行处理,将业务表中主键相同的记录项的权值相加,得到的权值如果大于阈值,则将这样的记录放在比对结果表中。很笨笨的。
由于人员登记的项目还是比较多的,如姓名、身份证号、性别、年龄、民族等等。为了得到比较精确的结果。就给这些公共的字段赋予不同的权值,比如身份证号的匹配度就很高,我们把权值设为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
如:
当前插入一条记录:
自增字段 姓名(权值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