想做一个这样的系统:
一个人周围有10个朋友(第一层)
这10个朋友每人还有10个朋友(第二层)
这朋友的朋友每人还有10个朋友(第三层)
也就是说,我只要认识了10个朋友就相当于认识了1000个朋友
如果我想查找这1000个朋友中有谁会美术(当然,有关键字段),请问数据库该如何设计,以及该怎么查找
我不知道这是树型结构还是网型的,就是说每个人注册后即可以发展自己朋友,如果a是b的朋友,那么b一定是a的朋友......
想了好几天了,问了好多人了,一直不知道.....请问谁能帮助指点一下
:)

解决方案 »

  1.   

    人员id ...什么的一个表互相关系ref一个表......
    select * from id where id in
    (select id from id where id in 
    (select id from id表 where ref_id = id))
    想要几层套几层吧
      

  2.   

    但有这样一个问题,就是死循环,也就是说如果a是b的朋友那么b就是a的朋友,
    在ref 表中这样查找的话会一直进行的啊
      

  3.   

    双向的十字链表的方式(数据结构)
    比如人员表tid包括:
    -id -- name -- special   
    id1, name1, 特长内容1(比如美术,数学)。
    id2, name2, 特长内容2(比如数学,画画)
    id3, name3, 特长内容3(比如数学,画画)如果1是2的朋友,就向关系表Tref中增加2个记录:
    main_id , ref_id
    id1,        id2
    id2,        id1
    ==================
    3 是2的朋友增加
    id3         id2
    id2         id3 然后我们就有了一下的sql语句。以下是会美术的id
    select id from tid where substr(special, '美术,') > 0 ;然后找有朋友会美术的就是
    select id from Tref 
        where ref_id in ( 会美术的select语句 )
        
    继续找3层的就是    
    select id from Tref 
        where ref_id in ( 有朋友会美术的select语句 )
        
    4层就.......
      

  4.   

    select 语句是不会死循环的拉。
      

  5.   

    你的意思也就是说不从单个结点入手,而是先把所有的记录都遍历一次,然后在用in的方法找到需要的记录是吧:)
    我开始想的是从单个人先查,也就是先找Tref表,所以一直想不通
    呵呵
    这样做效率怎么样啊?:)
      

  6.   

    做上索引,应该能够支持个百八十万条记录感觉不出慢。logn1000000 = 人数
      

  7.   

    是人员表中的
    id
    还是关系表是的
    main_id or ref_id