Recursive Data Model 1:M (순환관계)
Recursive Model 로의 통합이 필요한 이유
M:M 관계 순환처리
- 아빠가 2명 ?
- 생산공정 쪽의 BOM (Bill of Matrial)에서의 원가계산을 위해서 사용하면 유용함
SQL문 예시
1. JOIN과 비교
- 위 예제는 부모로부터 자식을 찾는 예제이다.
(자식으로부터 부모를 찾는 것도 물론 가능하다.)
- SQL문 규칙
1. FROM 에 Table 은 1개만 적는다. (몇번 Recursive JOIN 될지 모른다.)
2. CONNECT BY 에는 먼저 읽힌 놈을 앞에 적는다.
3. START WITH 에 Driving 조건(똑똑한 놈)을 적고 WHERE에 Check 조건(덜 똑똑한 놈) 을 적는다.
(가능하면 START WITH 조건에는 INDEX가 있는 Data를 활용하는 것이 좋다.)
- 수행속도 증가를 위한 TIP을 하나 주자면 통상 최상위는 NULL이 아닌 특정 ID로 한다.
왜냐면 NULL은 INDEX-SCAN이 되지 않기 때문이다.
그러기 위해서는 최상위를 가리키는 Data 1개를 넣어두어야 한다. 그 Data의 부모는 NULL로 해도 상관없다.
2. 형태별
- 소그룹별에는 START WITH에그룹 구분이 반드시 포함되어야 한다.
3. 조건별
- 이하 그룹 삭제는 CONNECT BY에서 'F'를 제외시키야 하고
'F'만 삭제하는 경우에는 WHERE (Check 조건)에서 'F'를 제외시켜야 한다.
4. 제한사항
- JOIN 이 안됨 : INLINE VIEW를 활용할 수는 있으나 ( ) 로 수행순서 조절은 불가능하다.
- SUBQUERY는 요즘은 잘 된다. 구버전 Oracle 사용시는 가능여부를 확인해 봐야한다.
- SQL문으로는 1촌 관계만 가능하다. (즉 아버지까지만 갈 수 있다.)
- SP를 활용하면 가능하다. 하지만 잘못 만들면 수행속도가 느릴수 있다는건 염두해 두어야 한다.
SQL문 1번 호출에 계산을 여러번 하는 방법으로 해야 한다.
CODE 대입법
|
Recursive Data Model
|
- 사용하기 쉽고 간편하며 수행속도가 좋음 - 구조 변경에 매우 취약함 - 구조 변경시 과거 데이터의 수정이 필요 (부모가 바뀌면 자식들이 모두 다 바뀌어야함) | - 구조가 변경되어도 식별자는 변하지 않아 과거 데이터 변경이 불필요함 - 사용이 불편함 - 기술력이 필요함 (잘못 사용시 수행속도가 저하됨) |
Recursive Model 로의 통합이 필요한 이유
SELECT ... FROM TA1 x, TAB2 y, TAB3 z, TAB4 w WHERE (w.type = '1' AND w.key = x.key OR w.type = '2' AND w.kry = y.key OR w.type = '3' AND w.key = z.key ) AND w.conditions ... | SELECT ... FROM TAB5 x, TAB4 w WHERE w.key = x.key AND w.conditions ... |
- INDEX 형태에 따라 3배의 일량이 증가됨 - Stored Procedure로 일부 해결이 가능은 함 | - 작업량의 증가가 없음 |
M:M 관계 순환처리
- 아빠가 2명 ?
- 생산공정 쪽의 BOM (Bill of Matrial)에서의 원가계산을 위해서 사용하면 유용함
SQL문 예시
1. JOIN과 비교
- 위 예제는 부모로부터 자식을 찾는 예제이다.
(자식으로부터 부모를 찾는 것도 물론 가능하다.)
- SQL문 규칙
1. FROM 에 Table 은 1개만 적는다. (몇번 Recursive JOIN 될지 모른다.)
2. CONNECT BY 에는 먼저 읽힌 놈을 앞에 적는다.
3. START WITH 에 Driving 조건(똑똑한 놈)을 적고 WHERE에 Check 조건(덜 똑똑한 놈) 을 적는다.
(가능하면 START WITH 조건에는 INDEX가 있는 Data를 활용하는 것이 좋다.)
- 수행속도 증가를 위한 TIP을 하나 주자면 통상 최상위는 NULL이 아닌 특정 ID로 한다.
왜냐면 NULL은 INDEX-SCAN이 되지 않기 때문이다.
그러기 위해서는 최상위를 가리키는 Data 1개를 넣어두어야 한다. 그 Data의 부모는 NULL로 해도 상관없다.
2. 형태별
- 소그룹별에는 START WITH에그룹 구분이 반드시 포함되어야 한다.
3. 조건별
- 이하 그룹 삭제는 CONNECT BY에서 'F'를 제외시키야 하고
'F'만 삭제하는 경우에는 WHERE (Check 조건)에서 'F'를 제외시켜야 한다.
4. 제한사항
- JOIN 이 안됨 : INLINE VIEW를 활용할 수는 있으나 ( ) 로 수행순서 조절은 불가능하다.
- SUBQUERY는 요즘은 잘 된다. 구버전 Oracle 사용시는 가능여부를 확인해 봐야한다.
- SQL문으로는 1촌 관계만 가능하다. (즉 아버지까지만 갈 수 있다.)
- SP를 활용하면 가능하다. 하지만 잘못 만들면 수행속도가 느릴수 있다는건 염두해 두어야 한다.
SQL문 1번 호출에 계산을 여러번 하는 방법으로 해야 한다.
댓글 없음:
댓글 쓰기