所需功能:给定一个课程名,获得该课程下所有的主题、分面以及碎片,并且以RDF的形式组织。即主题-分面-碎片。分面就相当于主题与碎片文本之间的一个关系。思考之后,返回数据可以以树型组织,根节点是主题名,然后往下是各级分面,一级分面下面挂对应的二级分面,直到三级分面。只有叶子节点分面才会给挂碎片。
由于数据库特别大。在一开始实现的时候,采用的是多次读数据库的方式,每次需要查父分面或子分面时,都是去查数据库。每次给叶子分面节点挂碎片的时候,也是根据分面id去查碎片表。这样的性能特别特别慢,我记得查一个课程的数据用了快半个小时。
优化方法:减少多次去查数据库,因为每次去查数据库导致整体性能特别低。尽量一次读出数据之后就将数据保存着,以便后面使用。
解决方法:
根据课程id查数据库主题表,获得该课程下所有的主题,并保存在list中。
根据课程id查数据库碎片表,获得该课程下所有的碎片,并保存在list中。然后对碎片进行处理。将所有碎片保存在Map<Long, List>中,键值是分面id,值是该分面下所有的碎片。即将所有的碎片都挂在了分面下,并保存在map中,方便后续可直接根据分面id取出该分面下所有的碎片。
对分面进行处理。
根据主题id,获得该主题下所有分面(包含一级、二级、三级分面)。然后将一级、二级、三级分面分别放在不同的list中。
遍历一级分面:根据一级分面id,从二级分面list中判断该一级分面下是否有二级分面。如果有二级分面,再接着从三级分面list中判断该二级分面下是否有三级分面。有三级分面的话直接根据分面id从map中取出该分面下所有的碎片。一级、二级分面同理,如果下面没有子分面了的话,就直接根据分面id从map中取出所有碎片。
所有的结果都是保存在map中。
最后的结果是,键为主题名,接下来每一级是分面是键,值是子分面或者是碎片…