由于本人的毕业设计需要开发一个类似于百度贴吧的功能模块,从这么多年来贴吧的使用体会来看,其最基础、最主要的功能为:发帖——评论——回复。
这就形成了1:N(1个帖子:N个评论)和M:N(M个评论:N个回复)的关系。
一、在数据库方面,我们分为两种情况讨论:
①单表设计(评论数少):评论不多的时候,一个帖子对应两三条评论,那么数据表中一个帖子对应重复的数据也仅仅几条而已。但是这种情况比较少出现,因为很多时候这种"问题—评论“的模型通常对应很多条评论。所以我们放弃单表设计。
②多表设计(评论数多):如果每条帖子对应的评论数都很多,那么在单表设计模式下数据冗余情况就十分严重了,所以我采用分表的方法存储信息。
我的思路是分为帖子表和评论表两张表,并且两表用帖子的postid作为外键关联。先取帖子,然后再取评论,最后根据postid拼接成一条完整的json数据。
二、根据上面的思路,在数据量少的情况下做一个循环嵌套为演示,代码如下:
public List<Question> getMyQuestion(String userId){
//将数据复制到list
//获取帖子
List<Question> qList = questionDao.getMyQuestion(userId);
//获取评论
List<Comment> cList = questionDao.getComment();
//将list转换为jsonArr
//问题的json数组
JSONArray qArr = JSONArray.fromObject(qList);
JSONArray cArr = JSONArray.fromObject(cList);
//遍历jsonArr,对比key
for(int i=0; i<qArr.size(); i++){
JSONObject qObj = qArr.getJSONObject(i);
//获取问题的questionId
String qId = qObj.getString("questionId");
//声明评论数组
ArrayList tempList = new ArrayList();
for(int j=0; j<cArr.size(); j++){
JSONObject cObj = cArr.getJSONObject(j);
//获取评论的questionId
String cId = cObj.getString("questionId");
//判断qId和cId是否相等
if(cId.equals(qId)){
String cString = cObj.toString(3).replace("\\","");
//装入数组
tempList.add(cString);
}
}
//数组完成后,put进当前json数据
qArr.getJSONObject(i).put("comment",tempList);
}
return qArr;
}
三、在此基础上,应用于”大厅看帖“的环境下,还可以做一些改进,例如分页查询。先收集查询结果,然后根据每一条结果的postid再去评论表查询对应评论,最后拼接。方法大同小异。
特此记录思路,希望能给大家带来些许的帮助。 (^_^)~~~