Algorithm2011. 12. 29. 02:18
The Adjacency List Model
The Nested Set Model

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

Tree와 같은 계층구조 데이터를 처리할 때면 늘상 조회 속도 문제로 골머리를 썩는다. 왜 이리 문제가 많은것일까?
허긴 평면구조의 관계형 DB 상에서 계층구조의 Tree 데이터가 쉽고 빠르게 조회되길 바라는 내가 더 이상하다.

모든 Tree 노드가 자신의 Parent 만을 참조하는 일반적 형태로 테이블을 구성했다면 데이터의 저장은 매우 빨리 처리될 것이나 조회는 재귀호출을 사용해야 하므로 매우 느려질 것이 자명하다. 양질의 네트웍과 고사양의 장비가 있기에 재귀적인 쿼리요청이 무리가 되지 않는다 하더라도 이를 피해갈 방법이 있다면 한번쯤 고민해 보는것도 나쁘진 않을듯 싶다.

이제부터 설계하고자 하는 시스템은 Tree 데이터의 저장(변경)보다는 조회 빈도가 월등히 높다고 가정한다. 그렇다면 저장시 부하가 걸리더라도 조회에 최적된 형태로 데이터를 유지하는 것도 나쁘지 않은 생각이다. 그렇다면 조회에 최적화된 Tree 데이터는 도대체 어떤 정보들을 포함하고 있어야 하며 어떻게 조회되어야 하는가? 이제 그 해답을 찾아보자..

아래 그림들을 유심히 살펴보자.
모든 노드들은 왼쪽 숫자와 오른쪽 숫자를 가지고 있으며 이를 "left" 와 "right" 라 지칭한다.
N-1에 시작하여 파란색 화살표는 노드 변경(추가 또는 삭제) 전의 경로이고, 붉은색 화살표하는 노드 변경(추가 또는 삭제)후의 경로이다. 파란 화살표를 따라 검은색 숫자를 순차적으로 따라가보면 변경전 Tree의 left, right 가 어떻게 구성되어 있는지 알 수 있을 것이다.

자. 이제 노드가 삽입 또는 삭제되었을 때 초록색 번호를 기준으로 특정 법칙에 따라 left, right 값이 shift(모든 숫자가 동일하게 증가하거나 감소함) 되어진다. 빨간 번호들이 shift 후의 left 와 right 값이다. 4가지 경우따라 shift 법칙이 틀려지는 것을 볼 수 있다.

1) 노드추가-1. 중간노드 삽입
NextSibling.left(3) 기준으로 업데이트 후 Node 삽입



2) 노드추가-2. 끝노드 삽입
NextSibling이 없으므로 Parnet.right(11) 기준으로 업데이트 후 Node 삽입



3) 노드삭제-1. 중간노드 삭제
NextSibling.left(3) 기준으로 (NextSibling.left - RemoveNode.left) 만큼 줄여준다



4) 노드삭제-2. 끝노드 삭제
NextSibling이 없으므로 Parnet.right(11) 기준으로 (부모노드의 right - 삭제노드의 left) 만큼 줄여준다



작성중~~~~~

Posted by 꼰스
Web Client/HTML52011. 12. 29. 00:37
앞으로 웹의 대새가 될거라는 주장이 있는 HTML5.
죽 지켜봐야 할 일이지만 개념파악 정도 하고 있다고 해서 나쁠것 없다는 판단에 링크 한번 모아봅니다.

[문학이 님의 블로그 - HTML5 Tip & Tech]
http://blog.naver.com/seogi1004/110095812775 - (1) 기초
http://blog.naver.com/seogi1004/110096142093 - (2) Drag & Drop
http://blog.naver.com/seogi1004/110096740941 - (3) Web Database
http://blog.naver.com/seogi1004/110098886402 - (4) Server Sent Events, 채팅 구현하기
http://blog.naver.com/seogi1004/110102214238 - (5) Web Forms In Cross Browser

읽는대로 링크 업데이트 중..

Posted by 꼰스
Web Client/JavaScript2011. 12. 28. 23:18
Javascript 에서 Java의 Map 과 유사한 작업을 하려면 Object 를 쓰시죠?
하지만 유용한 메쏘드가 없어 무척 불편했던 기억이 납니다.
약간의 여유가 생겨 Java의 Map 인터페이스와 유사한 클래스를 만들어 봤습니다.


[지원하는 메쏘드]

- get(key):object - 지정된 key 에 해당하는 value 를 얻는다
- remove(key):void - 지정된 key 에 해당하는 value 를 삭제한다
- keys():array - 전체 Key 값들을 배열로 얻는다
- values():array - 맵의 전체 값들을 배열로 얻는다
- containsKey(key):boolean - key 가 포함되어 있다면 true 를 반환한다.
- isEmpty():boolean - 맵이 비어있다면 true 를 반환한다.
- clear():void - 맵을 비운다
- size():int - 맵을 크기를 얻는다
- getObject():object - MapData Object 를 얻는다

[사용예]

<script language=javascript src="JMap.js"></script>
<script language=javascript>
<!--
    var map = new JMap();
    map.put("a", "11");
    map.put("b", "22");
    map.put("c", "33");
  
    alert("map.size()=" + map.size());
    alert("map.isEmpty()=" + map.isEmpty());
    alert("map.get('a')=" + map.get('a'));
    alert("map.containsKey('a')=" + map.containsKey('a'));
    map.remove('a');
    alert("map.remove('a')");
    alert("map.containsKey('a')=" + map.containsKey('a'));
    alert("map.get('a')=" + map.get('a'));
    alert("map.keys()=" + map.keys());
    alert("map.values()=" + map.values());
    map.clear();
    alert("map.clear()");
    alert("map.size()=" + map.size());
    alert("map.getObject()=" + map.getObject());
-->
</script>

첨부파일을 다운 받으신 후 사용하시면 됩니다.

Posted by 꼰스