为了简单起见,我就举个简单的例子:
有表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.需要分页。
请指教,谢谢!
有表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.需要分页。
请指教,谢谢!
上文中提到的“节目包name和节目name有可能存在重名”意思是:
节目包的名字有可能与节目的名字相同。
或者要是取包信息的话,用:select * from Movie m,Movie_Package mp where m.pack_id=mp.pack_id and mp.pack_id in(Pack_id1,Pack_id2....);
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相同的记录封装成一个对象。发现这样比较麻烦。
SELECT *
FROM MOVIE M, MOVIE_PACKAGE MP
WHERE M.PACK_ID = MP.PACK_ID
AND (M.NAME LIKE '%name%' OR MP.NAME LIKE '%name%');