恳请高手给予指点!!!拜托了!!!!!

[复制链接]
查看11 | 回复2 | 2011-5-31 22:55:00 | 显示全部楼层 |阅读模式
最近遇到这样一个问题,希望高手帮助给看看,谢谢!!!
表T1:T1用来存放从发站至到站所要经过的某一关键结点
记录形式如下表所示:
depart(发)arrive(到) pass(经过点)
------ -------
-----
(第一种类型)
A1
B1
C1
第1条记录
A2
B1
C1
第2条记录
A3
B2
C1
第3条记录
A1
B2
C1
第4条记录
A1
D1
C2
A2
D2
C2
B1
D1
C3
B2
D2
C3
---------------------------------
(第二种类型)
E1
F1
C1
第1条记录
E2
F1
C1
第2条记录
E2
F2
C1
第3条记录
E1
F2
C2
第4条记录
..
..
..
..
..
..
T1表中已经存放的记录条数约有100万条;
当前遇到的一个问题是:处于某种考虑,要对表T1进行变换整理,换言之,对T1表进行压缩,以使数据量变小,记录的条数变小。
为此,我对表T1进行了分析,发现了T1表中的数据可以分为两大类型:对于第一种类型的记录,可以通过创建映射关系的方法将记录条数变少,举例来说,对于第一种类型的前4条记录,通过观察不难发现,A1实际上可以认为是(A1,A2,A3)这三个站的代表,B1可以认为是(B1,B2)这两个站的代表。
于是,可以构建出一种映射关系表T2,与整理后的数据记录表T3,
T2:映射关系表
站名映射站名
------------
A2 A1
A3 A1
B2 B1
A1 A1
B1 B1

T3:整理后的数据记录表
depart(发)arrive(到) pass(经过点)
------ ------- -----
(第一种类型)
A1
B1
C1
即当要查询发站为A2站,到站为B1时(即表T1的第2条记录时),处理首先是从表T2中找到A2的映射站A1,B1的映射站B1(也就是在映射关系表中将自身也作为映射对象来统一管理),然后,在T3中查询到pass(经过点)为C1,这和在T1表中的第2条记录的数据是完全一样的。也就是说,在T3表中仅存1条记录,就可以表示原来T1表中的4条记录。
通过这一个简单的例子,可以看出,经过对第一种类型记录进行有关映射处理,尽管建立了一个映射关系表,但会使总的所需存放的记录数变少,即进行了T1到T3的记录压缩。

值得注意的是,在表T1中,不可避免第存在第二种类型的记录,即不能利用映射关系表示,换言之,利用映射关系表示第二种类型的记录,会使得整理后的数据发生错误。例如,对于第二种类型,若基于前3条记录,不难推出E2对应E1,F2对应F1,若采用这种映射关系表示,则可得出,发站为E1站,到站为F2等价于发站为E1站,到站为F1,那么这条记录的pass(经过点)为C1,但这与(第二种类型)中的第4条记录显然是矛盾的,因此,在整理时,对于第二种类型的记录,不应当进行映射处理,而应当原封不动地存放在T3中。
经过上述分析,可得出:对于T1表,经过整理后,
映射表T2:为
站名映射站名
---------------
A1 A1(自身对应)
B1 B1(自身对应)
D1 D1(自身对应)
E1 E1(自身对应)
E2 E2(自身对应)
F1 F1(自身对应)
F2 F2(自身对应)
A2 A1(映射)
A3 A1(映射)
B2 B1(映射)
D2 D1(映射)

整理后的数据记录表T3表为:
depart(发)arrive(到) pass(经过点)
------
------- -----
(第一种类型)
A1
B1
C1
A1
D1
C2
B1
D1
C3
(第二种类型)
E1
F1
C1
E2
F1
C1
E2
F2
C1
E1
F2
C2

这种转换的好处在于对大记录数的T1表进行了数据整理,将使得记录条数大幅度变小。
通过上述说明,希望大家对问题的背景已经了解了,即T1已知,要构造出T2和T3,使得利用T2+T3能够完整地存储T1的所有记录信息,
那么现在面临的最主要问题是:如何利用存储过程来构造出T2和T3?
恳请高手给予指点!!!拜托了!!!!!
回复

使用道具 举报

千问 | 2011-5-31 22:55:00 | 显示全部楼层
首先,我要修正一下,T1表的记录数确切说是300万条,不大,做索引没问题,
其次,我要解释一下我所做出的T2和T3,有点绕,但作用可以类比为从若干相似记录中只提取出一条记录作为样本,而剩余的记录我不存在T3中了,只是存放T2中一种映射关系,
在数学上也可以这样理解
若 A * B=C,那么当 Z * B =C时,我可以认为A=Z;在T1表中,发站与到站确定了PASS结点,那么当以确定的到站与PASS结点为条件查询,可以找到比如100条不同的发站,但利用前面我讲的数学思路,我可以认为这100条记录实际上就是一条记录,存放于T3中,而为了表述不同的发站或到站,我再建立映射关系存于T2中,这样,我就用T2与T3两表实现了T1表的所有作用。
第三,我要解释一下我为什么要这么做,原因是这样的,1,T2与T3表完全是为了使T1表记录数变少而人为构造的,除了为减少记录条数外,无其它任何作用;2,这种整理并不是经常性的,因而对整理的时间要求并不高,3,为什么非要进行压缩?目的很明确是想把全部数据T1从数据库中导入到内存中进行后续的处理,因此,不打想直接读入300万条记录,测算过,直接读入大约占内存400M,所以想尽量压缩一下T1 ,使得记录数能够到20-30万条,这样占用内存为30M,是可以接受的。
所以,才考虑采用以上思路进行压缩。
在进行T1到T2+T3的转换过程中,要求使用存储过程来实现,因此,我一直很困惑干该怎么样去写,整理转换的时间并不做很严格的要求,2-3个小时的计算都是可以接受的。希望高手们给些建议和思路,再次感谢大家!!!!!
回复

使用道具 举报

千问 | 2011-5-31 22:55:00 | 显示全部楼层
我仔细想了一下,这种问题特别类似于将表中相同的多条记录合并为一条记录,所不同的是:现在定义的“相同记录”,绝对不是实际意义上的各个字段完全相同的含义,而是具有相同作用结果的一类数据,

a1b1c1
a2b1c1
a3b1c1
这三条记录,若通过观察,是完全不同的三条记录,而一旦再仔细看看,就会发现,除了第一列不同外,其它数据都一样,因而,实际上可以存为
a1b1c1 一条记录即可,而再令a2=a1,a3=a1即可,
再次希望大家给想想,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行