为了简单起见,我就举个简单的例子:
有表Movie:
id,name,information,pack_id(id为pk,pack_id为fk,关联表Movie_Package pack_id,表示节目所属的节目包)
表Movie_Package:
pack_id,pack_name,pinformation(pack_id为pk)说明:表的关系其实很简单,Movie表示节目信息,Movie_Package表示节目包信息,节目包可以包含多个节目,节目包name和节目name有可能存在重名。现在要做的是:给定一个name(有可能是节目名,也有可能是节目包名,所以需要同时查Movie和Movie_Package两张表),需要找到其相关信息(支持模糊查询).相关信息包括:Movie的相关信息,Movie_Package的相关信息。封装成以下对象,格式如下:
class ProgramInfo {
    Movie[] movies;                //如果没找到相关节目信息则该字段为Null,封装从Movie表中找到的节目信息
    Movie_Package[] packages;      //如果没找到相关节目包信息则该字段为Null,封装从Movie_Package表中找到的节//目包信息
}
注:
Movie类定义如下:
class Movie {
  Movie表中的字段
}
Movie_Package类定义如下:
class Movie_Package {
   Movie_Package表中的字段
   Movie[] movies;               //封装节目包下的节目信息
}小弟目前有几个想法:
第一种(最笨的办法,可能效率最慢):
1.从Movie表中按给定的name找节目信息,封装到ProgramInfo—>Movie[]。
2.从Movie_Package表中按给定的name找节目包信息,封装到ProgramInfo—>Movie_Package[]—>Movie_Package
3.利用循环语句,根据找到的Pack_id,多次查询DB,得到每个节目包下的节目信息,封装到ProgramInfo—>Movie_Package[]—>Movie[]。这个在现实中估计行不通,一是模糊查询的时候数据量可能比较大,而且可能存在并发的情况,另外可能需要考虑分页,小弟第一次用Oracle(版本9i),像我这种情况有没有一种比较好的解决方案:1.考虑性能。2.需要分页。
请指教,谢谢!

解决方案 »

  1.   

    再说明一下
    上文中提到的“节目包name和节目name有可能存在重名”意思是:
    节目包的名字有可能与节目的名字相同。
      

  2.   

    第三步不用多次查啊,使用select * from Movie where pack_id in(Pack_id1,Pack_id2....);一次搞定。
    或者要是取包信息的话,用:select * from Movie m,Movie_Package mp where m.pack_id=mp.pack_id and mp.pack_id in(Pack_id1,Pack_id2....);
      

  3.   

    可能会找到的信息如下;
    id   name     information     pack_id
    1    aaa         dsfds          A
    2    ddd         dsfds          B
    3    ddd         eee            A
    4    eee         dfd            B实际上这四条记录只能封装成两个对象,因为只有A,B两个Pack_id
    楼上的想法我原来也考虑过,就是按上表找出所有的信息 order by pack_id排序,然后根据pack_id来组包,所有pack_id相同的记录封装成一个对象。发现这样比较麻烦。
      

  4.   


    SELECT *
      FROM MOVIE M, MOVIE_PACKAGE MP
     WHERE M.PACK_ID = MP.PACK_ID
       AND (M.NAME LIKE '%name%' OR MP.NAME LIKE '%name%');