Maison > Article > développement back-end > 数据结构 - php 对 mysql 数据库遍历的问题
比如,代理级别分:金、银、铜三级,我现在是金牌代理A,同时我发展了银牌代理B、C、D,银牌代理b发展了铜牌代理E、F,如图:
A的下级代理列表
╦═══════
║
╠═ b
║ ╠══ e
║ ╠══ f
╠═ c
╠═ d
我现在用程序作出上面这样一张例图方法是:(PHP+MYSQL)
先搜索所有上级代理为A的代理,
例如找到了B代理,再搜索所有上级代理为B的代理,本次搜索完毕。
再搜索C代理 …………
以此类推。
现在代理数据库中有三十万条记录,每个代理都可以在代理分销系统中查看自己的下级代理树,按照以上方法:
每次搜索都要很久,如果某个代理的下级代理有1000个,那就根本显示不出来。
我想到的解决办法是用一个数组存储所有用户关系,然后将这个数组存储为文件,对每次添加删除用户都对这个数组同时进行更新操作,然后把想要的数据从数组遍历出来,然后直接到数据库中执行一个select就可以了。。这种办法可行么,还有什么其他解决方案么
想从上层会员找其下的底层会员,会用到遍历,目测是三叉树的层次遍历,这个算法,目测会对数据库进行好多好多次的查询。。。太耗费资源了,有没有什么替代方案?缓存?redis?
比如,代理级别分:金、银、铜三级,我现在是金牌代理A,同时我发展了银牌代理B、C、D,银牌代理b发展了铜牌代理E、F,如图:
A的下级代理列表
╦═══════
║
╠═ b
║ ╠══ e
║ ╠══ f
╠═ c
╠═ d
我现在用程序作出上面这样一张例图方法是:(PHP+MYSQL)
先搜索所有上级代理为A的代理,
例如找到了B代理,再搜索所有上级代理为B的代理,本次搜索完毕。
再搜索C代理 …………
以此类推。
现在代理数据库中有三十万条记录,每个代理都可以在代理分销系统中查看自己的下级代理树,按照以上方法:
每次搜索都要很久,如果某个代理的下级代理有1000个,那就根本显示不出来。
我想到的解决办法是用一个数组存储所有用户关系,然后将这个数组存储为文件,对每次添加删除用户都对这个数组同时进行更新操作,然后把想要的数据从数组遍历出来,然后直接到数据库中执行一个select就可以了。。这种办法可行么,还有什么其他解决方案么
想从上层会员找其下的底层会员,会用到遍历,目测是三叉树的层次遍历,这个算法,目测会对数据库进行好多好多次的查询。。。太耗费资源了,有没有什么替代方案?缓存?redis?
建议分级查询,按需查询数据,一次性显示一个关系树查询次数多,耗资源;
这样的实现可以看无限级分类,使用左右值原理,先序遍历树形结构,与商场的分类同原理
先检查代理级别建索引了没。
整个树显示出来一个页面也不合适吧,可以做成按需查询。
金牌代理打开页面显示下级的所有银牌代理,点击银牌代理用户再查看他下级的铜牌代理
谢邀,说说我的几个思路吧:
如果更新不是很频繁的话,使用缓存
(数据量30万,估计只能缓存1~2级了),不用每次用SQL查询。
多次加载,这个楼上也说了,先加载N级
的,等点击后,再ajax去请求N+1级
的。
树结构 无限极分类
自己搜索具体答案吧,这个讲细了很麻烦,大致原理说一下给你。
怎么才能最快的知道谁是自己的下级呢?如果大家来站队的话,满足两个条件即可,1- 你知道谁是第一个,2-保证自己是最后一个 (当然也可以知道谁是最后一个,保证自己是第一个)
根据这个推论为每个节点编上一个合适的序号即可实现快速查找,如 select * from tree where indexNumber >= search.node.min && indexNumber
最终的表结构类似
id, parent_id(父节点), top_id(根节点,如果有多个树的时候), indexNumber(树内的索引编号,top_id+indexNumber是唯一的), min(已我为基准,谁是本分支下的第一个), level(树高)
对于你的例子应该类似 (括号内第一个数字是索引号,第二个是min,第三个是树高)
<code> a(6,1,0) b(3,1,1) c(4,4,1) d(5,5,1) e(1,1,2) f(2,2,2)</code>
这个结构在节点操作的时候较复杂(比如你在f后面加个g,或者删掉f,那么abcd都需要重新计算序号),但是搜索就非常快了,一般一次搜索就能出结果啦。