免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1934 | 回复: 6
打印 上一主题 下一主题

两个强悍的SQL需求,希望大家能给予宝贵意见 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-16 18:30 |只看该作者 |倒序浏览
两个强悍的SQL需求,希望大家能给予宝贵意见


两个强悍的SQL需求,希望大家能给予宝贵意见:
一,区域计算:要求将下面表A中记录按起点和终点关系归属于同一区域中去,不管方向如何,只要有路径关联就属于同一区域。
A表
startNo(起点)        endNo(终点)
A                             B
B                             C
D                             E
E                             F
G                             H
I                             A
I                             J

实现后的B表
B表
groupId(区域号)        nodeId(节点)
1                            A
1                            B
1                            C
1                            I
1                            J
2                            D
2                            E
2                            F
3                            G
3                            H

现在数据量达到300W条,我暂时使用最S的办法就是一条一条查,得跑10几个小时才能算完。请高手给点意见,存储过程或程序实现方案都行。
--------------------------------------------------------------------------------------------------------------------------------------------------------------

二、环路计算:要求将C表中的节点按能构成一个闭合环路的记录生成到D表中按圈为单位保存。
C表
startNo(起点)        endNo(终点)
A                               B
B                               C
C                               A
E                               F
F                               E
I                               A
I                               J

实现后的D表
D表
roundId(区域号)        nodeId(节点)
1                             A
1                             B
1                             C
2                             E
2                             F

论坛徽章:
0
2 [报告]
发表于 2009-05-16 21:42 |只看该作者
用树型结构嘛,第一个应该简单些,第二个真够呛

论坛徽章:
0
3 [报告]
发表于 2009-05-16 22:36 |只看该作者
貌似是图论里边的内容, 标准sql并不能很好的实现, 最好能用别的编程语言, 如C/C++来实现, 具体算法, 可以找一本图论的教材看看.

论坛徽章:
0
4 [报告]
发表于 2009-05-17 21:06 |只看该作者
感谢两位的意见,如果能提供更详细的思路就好了,不管是用存储过程还是用JAVA都可以,希望更多的朋友来关注!

论坛徽章:
0
5 [报告]
发表于 2009-05-18 15:19 |只看该作者
可不可以建立一个辅助表呀
比如建立路径的时候A,B
则插入这个表
A 1
B 1
在建立路径的比如B,C的时候则在这个表查询{建立索引}如果只有一个存在则将另外一个不存在的插入索引表,并将GROUP 设置为已存条目的GROUP。如果都不存在则都插入并新增一个GROUP,如果都存在则将这个个存在集合的GROUP都设置为较小的那个
这样你查询起来就快多了
但是插入的时候会慢一些。不过加入索引后就好多了

第二个也可以用辅助表的形式,差不多的方式,只是插入的时候会慢一点,但是查询的时候不会慢,这个看你的应用时偏重于查询还是插入了。

[ 本帖最后由 jacketble 于 2009-5-18 15:29 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-05-18 23:05 |只看该作者
原帖由 jacketble 于 2009-5-18 15:19 发表
可不可以建立一个辅助表呀
比如建立路径的时候A,B
则插入这个表
A 1
B 1
在建立路径的比如B,C的时候则在这个表查询{建立索引}如果只有一个存在则将另外一个不存在的插入索引表,并将GROUP 设置为已存条目 ...

答案不对,你对需求还没有完全理解,要知道,每一条路径,不但要从起点找到终点,还要从终点找到起点,必须两向找才行,否则不能将本路径的上一级路径找出来

论坛徽章:
0
7 [报告]
发表于 2009-07-09 17:11 |只看该作者
节点查询
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP