개발 Q&A

제목 closure table 을 사용한 댓글관리 실용성이 있을까요?
글쓴이 darkninja 작성시각 2014/09/15 20:06:04
댓글 : 5 추천 : 0 스크랩 : 0 조회수 : 14557   RSS
삽질을 시작하기전에 가능성을 알고 싶습니다.
https://gist.github.com/dazld/2174233

에, 이건 결국 삽질로 끝났고여 ㅋㅋㅋ

http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=32065
이 분의 소스를 사용하였습니다.
				if ($c_id==0) {
					$c_id = $board_id;
					
					$c_group = $this->board_comment_model->get_min_group($board_table.COMMENT) - 1;
					$c_depth = 0;
					$c_order = 1;
			  }
				else {
					//$c_group = $c_group; 
					$c_order = $c_order + 1;
					$c_depth = $c_depth + 1;

					$tm_comments = $this->board_comment_model->get_depth_order($board_table.COMMENT, $board_id, $c_group);
					foreach ($tm_comments as $tm_comment) {
						if ($c_depth > $tm_comment->depth) {
							break;
						} else {
							$c_order = $tm_comment->order + 1;
						}
					}
					$this->board_comment_model->update_order($board_table.COMMENT, $board_id, $c_group, $c_order);
				} 
핵심 처리부분은 이렇게 되더군요!
실력이 나아지면 수정이나 보완이 필요할수도 있습니다.

http://blog.naver.com/jjusik2/165894833
이 곳에 대용량 자료 처리에 관해서 흥미로운 내용이 있습니다.
 다음글 안녕하세요. Facebook 피드 가져오기 관련하여 질... (3)
 이전글 codeigniter-restserver 에서 api_... (8)

댓글

변종원(웅파) / 2014/09/16 07:38:07 / 추천 0
실용성 질문전에 해보려고 판단하신 장점은 뭘까요? 글, 댓글 테이블과 3개의 필드 추가로 무한depth구현이 됩니다. 거기에 1개 필드 더하면 중간 댓글이 삭제된 경우도 트리를 표현할 수 있구요. 

위와 같은 구조면 트랜잭션을 사용해야 하고 join, where에 따른 비용을 생각해야겠죠
변종원(웅파) / 2014/09/16 07:43:45 / 추천 0
한참전에 phpschool에서 100만개 게시판 논쟁(?)이 있었던 적이 있습니다. 데이터 보관과 검색 효용성 측면에서 여러 로직에 대해 이야기가 있었습니다.검색해보시면 도움이 될겁니다.
한대승(불의회상) / 2014/09/16 11:30:38 / 추천 0
게시판에 댓글 무한 depth 구현에 대해선 조금 회의적 입니다.
게시판이라면 말이죠.. ^^;;

댓글 보다 덧글 형태로 문화가 바뀌고 있으니까요.

1:1 문답 이라든지 토론 게시판 같은걸 생각해 볼 수 있지만 기존의 유한 depth로 해결하지 못하는 부분인지에 대해서도 고려해 볼 필요가 있다고 봅니다.

다른 용도로 사용되는 프로그램이라면 어떤 곳에 활용이 가능 할 까요?

마인드맵? 인공지능 트리? 
웬지 샛길로 빠진듯한... ㅡㅡ;;;
darkninja / 2014/09/16 13:15:20 / 추천 0
일단 붙여서 동작하는걸 확인중입니다.
 
public function add_child($comment_table, $closure_table, $node_id, $target_id = 0) {
$sql =  '(SELECT `ancestor`, '.$node_id.', `lvl`+1 FROM `'.$closure_table.'` '.
   'WHERE `descendant` = '.$target_id.') '.
      'UNION ALL '.
      '(SELECT '.$node_id.','.$node_id.',0)';
 
    $query = 'INSERT INTO `'.$closure_table.'` (`ancestor`, `descendant`, `lvl`) '.$sql;

    $result = $this->db->query($query);
 
    return $result;
  }
이게 추가함수인데
union all 로 필요없는 더미 정보가 테이블에 추가됩니다.
다른 소스를 찾아봐도 같은 형태가 있더군요!
이부분을 없앨수 있다면
조금 나아질수 있겠는데
안된다면
삽질 가능성이 99% 이상이군요!
만들어 두면 언젠가는 다른 용도로 써먹을 날이 올지도...

아주 약간의 가능성이 있습니다.
일단 원 소스를 사용하면 작동은 할거 같으니
무에서 시작하지 않아도 됩니다.

시작이 반이니 50% 성공입니다 ㅋ
나머지 결과는 새로운 걸 만들어 내야 할거 같군요!

인터넷에서 무한검색과 찾아낸 소스를 맞는지 확인하고 (100% 입맛에 맞는 소스는 사실상 없지만...)
어렵게 찾아낸 소스를 또 붙이느라 삽질하고...
이러한 과정에 들인 시간과
기존 아이디어를 바탕으로 비슷한 걸 만들어 내는데
드는 시간이 차이가  그리 크지 않다는걸 며칠전의 삽질로 알았습니다.

이것을 시도함으로서 얻는 경험과 실력이 훨씬 도움이 된다는
사실을 알았기에 주저없이
시도해 봅니다^^
한대승(불의회상) / 2014/09/16 15:14:40 / 추천 0
union all 때문에 중복이 된다면 union 으로 해결 하면 됩니다만...
union all 을 쓰신 이유가 있겠죠. ^^