CS - DB(8) 관계 데이터 연산

김영현·2024년 11월 11일
0

CS

목록 보기
28/32

DB에서 원하는 데이터를 뽑아낸다

릴레이션에서 필요한 데이터를 얻는 행위가 관계데이터 연산이다. 프론트엔드에서 API로 받아온 데이터를 가공하는 과정과 유사하다.

가령 api/member/loevray엔드포인트로 요청을 보내면, 아래의 JSON이 클라이언트로 넘어온다고 해보자.

const response = {
	id:'velog997',
  	nickname:'loevray',
  	age:99,
  	posts:{
      	byIds:{
        	'333':{
            	title:'관계 데이터 연산',
              	comments:{
                  ...
                }
            },
            '444':{
            ...
            }
        },
    },
}

만약 여기서 posts의 제목들만 가져오고싶다면 대충 아래와 같은 연산을 진행할 것이다.

const titles = [];

const {  byIds: postsByIds } = response.posts;

for(const postId in postsByIds){
	titles.push(postsByIds[postId].title);
}

이렇게 반복문과 구조분해할당을 사용하여 방대한 JSON에서 사용자(개발자)가 원하는 제목만 쇽 뽑아냈다.

DB도 마찬가지다. 저장된 방대한 데이터에서 사용자가 원하는 데이터만 추출해내는 연산을 관계 데이터 연산이라고 표현한다.

한 번 진득히 알아보자~


관계 데이터 연산이란?

원하는 결과를 얻기위해 필요한 처리요구를 릴레이션에 수행하는 것.
관계 대수와 관계 해석 두 가지 방법이 존재한다.

  • 관계 대수 : 원하는 결과를 얻기 위해 데이터의 처리 과정을 순서대로 기술
  • 관계 해석 : 원하는 결과를 얻기 위해 처리를 원하는 데이터가 무엇인지만 기술

이렇게 놓고보니 명령형, 선언형코드의 차이와 굉장히 유사하다!


관계 대수

절차 언어라고도 한다. 처리 과정을 순서대로 기술하다보니 어떻게데이터를 가져오는 지가 중점이다.
대표 연산자 8개를 이용하여 처리하며 일반 집합 연산자, 순수 관계 연산자로 분리된다.

또한 폐쇄 특성(closuer property)이 존재한다.
=> 피연산자도 릴레이션인데, 연산의 결과도 릴레이션이다.


일반집합 연산자(set operation)

합집합, 교집합, 차집합, 곱집합. 총 4가지 집합을 이용한 연산이다. 당연하게도 피연산자가 두 개 필요하며, 곱집합을 제외한 연산은 두 릴레이션이 합병이 가능해야 한다
=> 두 릴레이션의 차수(속성의 개수)가 같고 대응되는 속성의 도메인(자료형)이 같아야 한다.

한번 각 집합연산을 예시로 알아보자.

아래와 같은 릴레이션 두개가 있다.

학생

학번이름학년
101김철수1
102이영희2
103박민수1
104최지현3

체육 수업참여 학생

학번이름학년
103박민수1
104최지현3
105정호진2
106김민지1

합집합(UNION)

교환법칙R U S === S U R과 결합법칙(R U S)U T = R U (S U T)이 성립한다.
차수는 R,S차수와 같으며 카디널리티는 R+S카디널리티 이하다.

학번이름학년
101김철수1
102이영희2
103박민수1
104최지현3
105정호진2
106김민지1

예시 릴레이션을 삭제한 결과다. 중복은 제거된다.

교집합(INTERSECTION)

교환법칙R ∩ S === S ∩ R과 결합법칙(R ∩ S)∩ T = R ∩ (S ∩ T)이 성립한다.
차수는 R,S차수와 같으며 카디널리티는 Max(R.cardinality, S.cardinality)이하다.

학번이름학년
103박민수1
104최지현3

학생, 체육수업 참여 학생 두 릴레이션 모두 존재하는 튜플만 중복없이 나왔다.

차집합(DIFFERENCE)

교환,결합법칙이 성립하지 않는다.
차수는 R,S차수와 같으며 카디널리티는 아래와 같다.

  • R-S <= R
  • S-R <= S
학번이름학년
101김철수1
102이영희2

학생 - 체육수업 참여 학생 릴레이션 차집합 연산 결과는 위와 같다.

곱집합(Cartesian product)

교환R x S === S x R, 결합(R x S) x T === R x (S x T)법칙이 성립한다.
차수는 R+S, 카디널리티는 R x S다.

순수 관계 연산자(relation operation)

관계를 이용하여 연산을 진행한다.

선택(σ)

σ조건식(릴레이션) 릴레이션에서 조건을 만족하는 튜플 반환한다.
조건식 자리에는 비교연산자(>,<,>=,<=,=,!=)와 논리연산자(||, &&, !)가 올수 있다.
또한 교환법칙σ조건식1(σ조건식2(릴레이션)) = σ조건식2(σ조건식1(릴레이션)) 가 성립한다

σ 학년 = 1 (학생) 연산을 진행한 릴레이션은 다음과 같다.

학번이름학년
101김철수1
103박민수1

학년이 1학년인 튜플들만 결과로 남았다.

프로젝트(π)

π속성리스트(릴레이션) 릴레이션에서 주어진 속성들의 값으로만 구성된 튜플들 반환한다.
단, 중복 튜플은 제거됨

π 이름,학년 (학생)연산을 진행한 릴레이션은 다음과 같다.

이름학년
김철수1
이영희2
박민수1
최지현3

이름, 학년 컬럼만 남게되었다.

조인(⨝)

공통속성을 이용해 두 릴레이션의 튜플들을 연결하여 만들어진 새로운 튜플 반환한다
자연 조인(natural join)이라고도 한다.

학생 ⨝ 체육 수업 참여 학생 연산을 진행한 릴레이션은 아래와 같다.(학번기준 조인)

학번이름학년
103박민수1
104최지현3

디비전(÷)

R ÷ S 릴레이션S의 모든 튜플과 관련있는 릴레이션 R 튜플로 결과 릴레이션을 구성한다
단, 릴레이션 R이 릴레이션 S의 모든 속성을 포함(S가 R의 부분집합)이어야 연산 가능하다.

모범생 릴레이션

이름학년
박민수1

학생 릴레이션 ÷ 모범생 릴레이션연산을 진행한 결과는 다음과 같다.

학번
103

느낀점

graphQL을 찍먹할때 해보았던 연산과 유사하지만, 약간 다른것 같기도 하고?
이해는 됐으니 이제 SQL로 실습해보면 몸에 잘 익을 것 같다

profile
모르는 것을 모른다고 하기

0개의 댓글