2020. 6. 18. 11:26ㆍ컴퓨터언어/Database
👊 관계 데이터 연산이란?
데이터베이스는 현실 속 정보를 컴퓨터에 저장하고 이를 표현하기 위해서 존재한다.
이때 현실 속 정보를 컴퓨터의 비트로 대응시키는 것이 "데이터 모델링"이고, 이렇게 만들어진 각 릴레이션별 "개체"가 "데이터 모델"이다.
데이터 모델은 반드시 다음 3가지 요소(S.O.C)를 가지고 있어야 한다.
Structure : 데이터베이스의 각 개체가 서로 어떤 관계를 가지고 있는가 ex <학생> & <교수>
Operation : 데이터를 저장하고 표현하기 위해 필요한 연산은 무엇이 있는가
Constraint : 무결성을 지키기 위한 조건은 무엇인가
우리는 이렇게 만들어진 데이터 모델들을 서로 가공해서 원하는 결과를 얻어야 하는데, 그러려면 DBMS를 사용할 수 있어야 하고, 이때 필요한 것이 SQL 언어다.
그리고 그 SQL 언어의 이론적 기반이 되는 것이 관계 데이터 연산이다.
🙌 관계대수 vs 관계해석
관계 데이터 연산은 관계대수와 관계해석으로 나뉜다.
관계대수는 내가 원하는 결과를 얻기 위해서 "어떻게 연산할 것인가"의 관점이고,
관계해석은 내가 지금 "무슨 결과를 얻고 싶은가"의 관점이다.
예
100만개의 회원정보 중에서 서울에 사는 20대 남성을 추려내고 싶다고 가정해보자.
관계대수는 범위를 좁혀가는 "과정에서 필요한 연산들이 무엇인지(ex 먼저 이만큼을 추려낸 뒤 거기서 이 테이블과 이 테이블을 조인하고 또 추려야겠군)" 알아내는 것이므로 "절차적 언어"라고 불리고,
관계해석은 "단지 원하는 결과가 무엇인지(20대 남성 ㅇㅋ)" 알아내는 것이므로 "비절차적 언어"라고 불린다.
즉 관계대수란 관계해석을 어떻게 구할지 그 유도 방법을 기술한 것이다.
관계해석은 추상적 개념에 지나지 않기 때문에, 실제 데이터베이스를 구현하는 과정에서는 관계대수가 더 중요함을 알 수 있다.
🙌 튜플 관계 해석 vs 도메인 관계 해석
관계해석이란 "얻고 싶은 결과"라고 하였다.
이때 전체 테이블 중에서 내가 얻고 싶은 결과의 레코드들이 어떤 것들인지 규정한 것이 "튜플 관계 해석"이고,
구하고자 하는 결과의 특정 속성의 범위를 따로 규정해 놓은 것이 "도메인 관계 해석"이다.
🙌 일반 집합 연산자 vs 순수 관계 연산자
관계대수는 다시 일반 집합 연산자와 순수 관계 연산자로 나뉘며, 이 둘은 모두 사용자가 원하는 결과를 도출하기 위해 필요한 연산들을 규정한 것이다.
일반 집합 연산자
- 합집합 UNION : 두 릴레이션의 스키마가 같아야 하며(구성된 속성이 모두 같음), 공통된 튜플은 한 번만 쓴다.
- 교집합 INTERSECTION : 두 릴레이션의 스키마가 같아야 하며, 공통된 부분만 추출
- 차집합 DIFFERENCE : 두 릴레이션의 스키마가 같아야 하며, 공통된 부분을 제외하고 한 쪽에만 존재하는 결과만 추출
- 카티션 곱 CARTESIAN PRODUCT : 두 릴레이션의 스키마가 달라도 되지만 공통속성은 있어야 함. 모든 튜플을 조합함. 순수 관계 연산자의 JOIN의 전단계로서 매우 중요
순수 관계 연산자
- SELECT(SQL의 그 SELECT 아님) : 전체 릴레이션에서 필요한 "행(수평적 부분집합)"을 구하는 연산(SQL에서의 WHERE)
- PROJECT : 전체 릴레이션에서 필요한 "열(수직적 부분집합)"을 구하는 연산(SQL에서의 SELECT ~ FROM)
- INNER JOIN : Equi JOIN(공통속성에서 값이 서로 같은 것만 추출), Natural JOIN(Equi JOIN에서 두번 표현된 속성을 한번만 표현), Theta JOIN(공통속성에서 값이 서로 같지 않아도 다른 조건으로 추출시킬 수 있음)
- OUTER JOIN : 양쪽 테이블이 서로 조건이 맞지 않는 부분을 Null로 기입하여 모두 JOIN하는 방법
- DIVISION : 나누어지는 테이블의 내용을 모두 만족하는 것만 남기는 연산
이제 관계대수와 관계해석을 알았으니, 이를 기반으로 탄생한 SQL을 알아보러 가보자.
'컴퓨터언어 > Database' 카테고리의 다른 글
트리거 - 서로 연동된 릴레이션에 연쇄조작을 가해 무결성 확보 (0) | 2020.06.21 |
---|---|
[SQL] DBA가 DBMS와 대화하는 언어 (0) | 2020.06.18 |
[Index, 선택성] 데이터베이스가 데이터를 빠르게 검색하는 방법 (0) | 2020.06.17 |
[View 설계 & Index 구축] 반정규화를 하기 전 고려해야 할 선택지 (0) | 2020.06.17 |
[반정규화] 논리적 설계에서의 정규화가 오히려 독일 때 (0) | 2020.06.17 |