쿼리 한번만 봐주세요 (데이터 관리방안 조언 부탁드립니다) 0 6 1,062

by 데미소다a [2018.12.24 15:46:56]


SELECT
       TYPE
     , major 
     , grade 
     , regexp_substr( con1, '[^:]+', 1, 2 ) con1
     , regexp_substr( con2, '[^:]+', 1, 2 ) con2
     , regexp_substr( con3, '[^:]+', 1, 2 ) con3
     , regexp_substr( con4, '[^:]+', 1, 2 ) con4
     , regexp_substr( con5, '[^:]+', 1, 2 ) con5
  FROM
       (
       SELECT
              TYPE
            , major
            , grade
            , regexp_substr( con, '[^/]+', 1, 1 ) con1
            , regexp_substr( con, '[^/]+', 1, 2 ) con2
            , regexp_substr( con, '[^/]+', 1, 3 ) con3
            , regexp_substr( con, '[^/]+', 1, 4 ) con4
            , regexp_substr( con, '[^/]+', 1, 5 ) con5
         FROM
              (
              SELECT
                     '시작' type
                   , '공학' major
                   , '1' grade
                   , 'c1:v1/c2:v2/c3:v3/c4:v4/c5:v5' con
                FROM
                     dual 
              ) 
       ) 

 

위 내용은 제가 여기저기 참고하여 만들어본 쿼리 입니다.

con 컬럼의 '/' 기호는 항목의 구분이며, ':' 기호의 앞에 값은 combo id, 뒤는 값은 combo value 입니다.

con 에 해당되는 컬럼이 40개 가까이 되어 이런식으로 데이터를 관리하고자 하는데요

마지막 결과 출력하는 부분 컬럼에서 con1, con2 를 c1, c2 이런식으로 조회된 결과로 별칭을 줄수는 없는건가요?

 

그리고, 혹시 이런식으로 con 컬럼과 같이 40개 가량 컬럼이 필요한 경우 데이터 관리는 어떤 방식으로 하면 효율적으로 할수 있는지 고수님들 조언 부탁드리겠습니다.

by 마농 [2018.12.24 16:09:34]

정규화 관점에서 보면 별도 테이블로 빼 내는 것이 좋을 듯 합니다.
(키(type, major, grade), seq(순서가 중요한 경우 필요), combo_id, combo_value) 형태로 만드는게 좋습니다.
자료 입/출력을 어떻게 할 것인지에 따라서 정규화를 따를지? 반정규화를 시도할 지?
반정규화를 한다면? 어떤 형태가 입출력 하기에 편리한지? 를 따져보면 되구요.

컬럼 의 개수나 별칭은 정적 쿼리만 가지고서는 가변으로 조정할 수 없습니다.
동적 쿼리를 이용해야 합니다.
정적 쿼리만 이용하려면 여러가지 변수를 생각해야 합니다.
개수가 40개 고정인가요? 아니면 가변인가요?
combo id 는 C1, C2, ~, C40 고정인가요? 아니면 가변인가요?


by 데미소다a [2018.12.24 16:34:25]

제가 아직 초보라 정규화와 반정규화의 개념이 부족한 상태여서 관련 문서는 다시 확인 해보도록 하겠습니다

그리고 combo 의 갯수는 현재는 38개로 고정이지만 추후 항목이 늘어날 경우 추가될 가능성은 있습니다


by 마농 [2018.12.24 16:46:32]

한컬럼에 몰아 넣는것이나,
38개 컬럼에 나누어 넣는 것은 그리 좋은 방법이 아닙니다.
id 와 value 까지 하면 38*2=76개 컬럼이 되겠네요.
id, value 2개 컬럼으로 구성해서 별도 테이블로 빼는게 좋습니다.
이러면 추후 개수가 늘어나는 것에 대비할 수 있습니다.


by 데미소다a [2018.12.24 16:57:26]

id는 한컬럼에 모두 입력하는 방법을 사용할때 구분을 하기위해 생각한 방법인데

이것이 효율적이지 않은 방법이라면 별도의 테이블을 생성 하는 방법으로 진행 해보겠습니다.

말씀 하신 방법으로 설계를 한다면

SELECT
       ui.user_id
     , ui.type
     , ui.major
     , ui.grade
     , c.c1
     , c.c2 ~ c.c38
  FROM
       userinfo ui
     , com_condition c
 WHERE ui.user_id = c.user_id

이런 형식으로 하면 될까요?


by 마농 [2018.12.24 17:14:44]

컬럼이 38개인개 아니라, 컬럼 2개인걸로 알려드린 거에요.
38개 항목으로 분리해서 보여줘야 한다면?
- PIVOT 기능을 사용할 수 있구요.
아니면, 아예 테이블을 38개 컬럼으로 분리하는 것도 한가지 방법입니다.
이렇게 되면 테이블을 별도로 분리하는 것도 굳이 필요 없을 수 도 있구요.
정답은 없습니다. 쉬운걸로 선택하세요.


by 데미소다a [2018.12.26 08:56:11]

아..이제 이해했습니다

말씀해주신 방법으로 다시한번 고민해보겠습니다.

바쁘실텐데 시간내주셔서 감사합니다

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입