Relational Model(관계형 모델)
#Database/Concepts
(10/10) 굉장히 공들여서 작성한 글이여서 원래 동아리 스터디 용도로 일부 공개 했었는데, 더 많은 분들이 봤으면 하는 마음에 오픈!
이전 챕터에서 여러 종류의 Data Model에 대해 간단히 언급하고 넘어갔다. 그 중 Relational Model에 대해 이번 챕터에서 다루게 된다.
관계형 모델로 만들어진 데이터베이스를 RDB라고 한다. RDB는 매우 중요하다. 실제로 여러분이 사용하는 서비스 대부분에서 대부분의 도메인을 RDB로 저장하고 있다.
Application에서 사용하는 DBMS나 프로그래밍 언어, 프레임워크는 언젠간 새롭고 더 나은 것으로 바뀔 것이다. 현재 IT 서비스 기업에서 가장 많이 사용하는 자바, 스프링, MySQL 은 언젠간 새로운 프로그래밍 언어(Ex. 파이썬, Rust 등등)이나 새로운 DBMS(ex. PostgreSQL)로 바뀔 확률이 높다. 하지만 어떤 DBMS를 사용하더라도 RDB는 계속해서 사용할 것이다.
요즘은 JPA와 같은 ORM 기술을 통해 SQL 구문을 작성하지 않고도 데이터베이스에 접근할 수 있다. 하지만 이런 기술은 언젠간 바뀌게 될 것이고, 새로운 기술이 등장했을 때 잘 사용하려면 기본적인 지식에 대한 이해가 필요하다. 간단하고 날로먹을 수 있는(?) 기술들을 배운다고 base 지식을 제대로 공부하지 않으면 안됩니다!
이제 본격적으로 관계형 모델에 대해 알아보자.
관계형 모델이란 이전 챕터에서 언급했듯이 데이터를 표(테이블) 형식으로 모델링한다. 각 테이블은 행과 열로 구성되어 있으며, 이 관계(테이블)들을 통해 데이터가 구조화됩니다. 이런 데이터 구조와 언어를 사용하여 데이터를 관리하는 접근 방식을 관계형 모델이라고 한다.
- 모든 데이터는 튜플(tuple) 형태로 표현되며, relation으로 그룹화됩니다.
- 관계형 모델로 구성된 데이터베이스를 관계형 데이터베이스(relational database)라고 합니다.
- 관계형 모델의 목적은 데이터를 명시하고 쿼리를 지정하는 선언적 방법을 제공하는 것입니다.
- 사용자는 데이터베이스가 포함하는 정보와 원하는 정보를 직접 명시하며, 데이터베이스 관리 시스템 소프트웨어가 데이터를 저장하고 쿼리에 응답하기 위한 데이터 구조를 설명하는 과정을 담당합니다.
- modern DB(MySQL, PostgreSQL)에서 사용되고 있다.
막 모르는 용어가 등장해서 처음 보면 무슨 말인지 이해하기 어려울 것이다. 관계형 모델을 다루다 보면 행(Row), 열(Column), 튜플(Tuple), 속성(Attribute), 관계(Relation), 도메인(Domain), 쿼리(Query) 등의 용어가 등장하는데, 이러한 용어들을 모아서 정리해보겠다
관계형 데이터 모델 - 용어 정리
관계형 모델에서는 모든 데이터를 표(Table)로 표현한다. 예를 들어, 학생의 정보를 관리하는 데이터베이스가 있다고 하면, 학생의 이름, 나이, 학번 등을 기록한 표가 하나 존재할 것이다.
학생 정보
| 이름 | 나이 | 학번 |
| 철수 | 20 | 001 |
| 영희 | 21 | 002 |
| 민수 | 22 | 003 |
2. 행(Row) = 데이터 한 줄 = 레코드(Record), 열(Column) = 속성(Attribute):
이 표에서 행(Row)은 각 학생에 대한 정보 한 줄을 의미해요. 예를 들어 철수의 정보는 한 줄로 표현되죠. 이 행을 레코드(Record)라고도 부릅니다. 열(Column)은 각 정보의 종류를 나타내요. 예를 들어 '이름', '나이', '학번'이 각각 하나의 열이 됩니다. ‘이름’, ‘나이’, ‘학번’과 같은 정보의 종류를 보통 속성(Attribute)라고 합니다.
- Column(열)은 특정 유형의 데이터 값을 모아 놓은 집합으로, 데이터베이스의 각 row(행)에 대한 값을 가집니다.
- Column(열)은 속성(attribute)이라고도 불립니다.
3. 튜플(Tuple):
각 행, 즉 데이터 한 줄이 튜플(Tuple)이에요. 철수의 전체 정보가 하나의 튜플인 거죠. 철수의 튜플은 (철수, 20, 001) 이렇게 표현할 수 있어요.
- 튜플 (Tuple): 테이블의 단일 행으로, 해당 relation(테이블)의 단일 record를 포함하는 것을 튜플이라고 합니다
4. 관계(Relation) = 테이블(Table):
이 표 자체가 하나의 관계(Relation)입니다. 그래서 이 모델을 "관계형 모델"이라고 부르는 거예요. Relation을 테이블(Table)로 부르기도 합니다.
- 테이블은 행과 열로 구성되며, 행(rows)은 record를 나타내고 열(columns)은 attribute을 나타냅니다.
5. Primary Key(PK, 기본 키)
각 레코드를 식별해주는 Attribute(속성)이라고 보면 된다. 대학생 정보를 저장하는 DB가 있다면 학번이 이에 해당할 것이다.
- Primary Key는 각 레코드에 대해 고유한 관계형 모델의 key입니다.
6. 도메인(Domain)
학번은 8자리 1000000~99999999 범위 이내의 값이어야 하고, 학생의 이름은 문자열이여야 하고… 이렇게 각 Column이 가질 수 있는 값의 범위가 존재할 것이다. Column에서 허용 가능한 값의 집합을 Domain이라고 한다.
- 도메인은 column이 포함할 수 있는 허용 가능한 값의 집합입니다.
- 이는 column의 데이터 타입과 다양한 property에 기반합니다.
7. 데이터베이스는 여러 개의 표로 구성될 수 있어요:
현실에서는 학생 정보뿐만 아니라 과목 정보, 성적 정보 등 여러 가지 데이터가 필요하겠죠? 이런 정보를 각각의 표로 관리하게 됩니다. 이렇게 여러 개의 표가 모여서 데이터베이스를 구성합니다.
8. 간단하고 명확하게 데이터를 관리:
관계형 모델의 가장 큰 장점은 데이터를 직관적으로 이해하고 관리할 수 있다는 점이에요. 표로 데이터를 나누어서 저장하기 때문에 어떤 정보가 어디에 있는지 찾기가 쉽고, 또 필요할 때 그 정보를 가져오는 것도 수월합니다.
9. 쿼리(Query):
데이터를 검색하고 조작하는 방법은 쿼리(Query)라고 불리는 명령어를 사용해요. 예를 들어, "이름이 철수인 학생의 나이를 알려줘"라고 요청할 수 있죠. 그러면 데이터베이스는 알아서 철수의 나이를 찾아서 알려줍니다.
관계형 모델의 연산 (Operations in Relational Model)
우리가 데이터베이스에 접근을 하는 이유는, 원하는 데이터를 가져오기 위함일 수도 있고, 데이터베이스에 데이터를 업데이트 하거나, 추가하거나, 삭제하기 위함일 수도 있다. 이러한 삽입, 갱신, 삭제, 선택을 연산(Operation)으로 분류한다.
- Insert Operation
- 새로운 튜플에 대한 속성 값을 제공하여 relation에 삽입됩니다.
- Update Operation
- 기존 튜플의 속성 값을 수정합니다.
- Delete Operation
- 조건에 따라 튜플을 선택하여 삭제합니다.
- Select Operation
- 조건에 따라 튜플을 선택합니다.
주의) Relations are Unordered
Relation에서 Record(Tuple) 간의 순서는 존재하지 않는다. 1번, 2번, 3번, … 요런 순으로 순서가 항상 존재하는게 아니다.
- 튜플의 순서는 중요하지 않습니다. 튜플은 임의의 순서로 저장될 수 있습니다.
- ex) 아래 relation을 보면 튜플 간에 순서가 따로 존재하지 않는다.
데이터베이스 스키마 (Database Schema)
데이터베이스의 논리적 구조를 의미한다. 스키마가 어떤 개념인지 감이 안오는 분들을 위해서 객체지향 프로그래밍 언어에 비유해서 설명해볼게요!
스키마(Schema) = 클래스(Class)
마치 자바와 같은 객체지향 언어에서 클래스가 객체의 구조를 정의하는 것과 유사하다.
- 클래스(Class): 클래스는 객체의 속성과 동작을 정의해요. 예를 들어, 강사라는 클래스를 정의할 때, 이 클래스는 ID, 이름, 부서명, 급여와 같은 속성(멤버 변수)들을 포함할 수 있죠.
- 스키마(Schema): 데이터베이스에서 강사라는 테이블을 정의할 때, 이 테이블은 ID, 이름, 부서명, 급여라는 열(Column)들을 포함해요. 이 열들이 테이블의 구조를 나타냅니다.
2. 인스턴스(Instance) = 객체(Object)
데이터베이스 인스턴스는 특정 시점에 데이터베이스에 저장된 실제 데이터를 의미해요. 이는 프로그래밍에서 클래스를 기반으로 생성된 객체(Object)와 유사합니다.
- 객체(Object): 클래스를 정의한 후, 실제로 그 클래스를 기반으로 여러 객체를 만들 수 있죠. 예를 들어, 강사클래스로부터 철수라는 객체를 생성할 수 있어요. 철수 객체는 ID, 이름, 부서명, 급여와 같은 실제 데이터를 가지게 됩니다.
- 인스턴스(Instance): 데이터베이스에서 강사 테이블에 여러 강사의 실제 데이터를 저장할 수 있어요. 특정 시점에 이 테이블에 저장된 모든 데이터가 바로 데이터베이스 인스턴스입니다. 실시간으로 변화하는 데이터베이스를 캡처한 스냅샷이라고 볼 수 있다.
3. 스키마는 고정, 인스턴스는 변화
- 클래스는 정의한 후 변경되지 않지만, 객체는 생성될 때마다 다른 데이터를 가질 수 있어요. (final 필드나 const 필드를 제외하면)
- 스키마도 테이블 구조를 정의한 후엔 잘 변하지 않지만, 인스턴스는 시간이 지나면서 테이블에 저장된 데이터가 추가되거나 변경될 수 있죠.
4. 예시로 연결
- 스키마 예시: 강사(ID, 이름, 부서명, 급여)는 강사라는 테이블의 구조를 정의하는 스키마입니다.
- 인스턴스 예시: 강사 테이블에 (1, "철수", "컴퓨터공학", 5000) 같은 데이터가 저장되어 있다면, 이게 바로 데이터베이스 인스턴스의 일부입니다.
키 (Keys)
위 용어정리에서 설명한 내용이에요. 키의 종류로 Primary key만 존재하는 건 아닙니다. 나중에 외래 키(Foreign Key) 등에 대해 다룰 기회가 있을 거에요.
- PK는 각 레코드에 대해 고유한 관계형 데이터베이스의 키입니다. 이는 운전 면허 번호, 전화 번호(지역 코드 포함), 차량 식별 번호(VIN) 등과 같은 고유 식별자입니다.
- 관계형 데이터베이스는 하나의 PK만 가질 수 있습니다.
- 보통 PK는 관계형 DB Table에서 columns에 나타납니다
⠀
관계 대수 (Relational Algebra)
지금까지 위에서 다룬 연산은 Relation, 즉 테이블 내에서의 연산에 대해서 다뤘습니다. 여기서 다룰 연산 체계는 하나 또는 두 개 이상의 Relation 간의 연산에 해당합니다.
- 관계 대수는 프로시저 언어(procedural language)로서, 하나 또는 두 개의 relation을 입력으로 받아 새로운 relation을 결과로 생성하는 일련의 연산으로 구성
- 여섯 가지 기본 연산자
- select: σ
- project: π
- 합집합 (union): ∪
- 차집합 (set difference): −
- 카테시안 곱 (Cartesian product): ×
Select Operation
- Select는 주어진 조건을 만족하는 튜플을 선택
- 선택 조건을 충족하는 튜플을 선택하는 표현식으로 사용
- 표기법 : 시그마 (σ) 기호로 표시
- p는 선택 조건 (selection predicate)라고 부름. 명제 논리에 해당
- r은 Relation(Relation 이름)
- 예: "물리학 (Physics)" 학과의 교수인 튜플을 선택
- 쿼리:
- 결과:
- 조건 비교는 =, ≠, >, ≥, <, ≤ 사용 가능
- 여러 조건을 AND (∧), OR (∨), NOT (¬) 연결자로 결합 가능
- 예: 물리학 학과의 교수 중 급여가 90,000 이상인 교수 찾기
- 쿼리:
- 예: 건물 이름과 동일한 학과 이름을 가진 학과 찾기
- 쿼리:
Project Operation(투영 연산)
- 특정 속성(attributes)을 생략한 relation을 반환하는 단항 연산(unary operation, argument가 1개인 연산을 말함)
- 표기법
- A_1, A_2…는 속성, r은 Relaition
- 결과는 A_1, A_2…A_k attribute의 relation으로 정의되며 나열되지 않은 속성은 삭제
- 중복 행은 제거됨, relation은 집합(set)이기 때문
- 예시) ‘ID’, ‘name’, ‘dept_name’, ‘salary’, 총 4가지 attribute를 갖는 relation에서 ‘dept_name’ attribute를 빼고 선택
- 쿼리:
- 결과:
관계 연산의 조합 (Composition of Relational Operations)
- 관계 대수 연산의 결과는 relation이다. 따라서 관계 대수 연산의 결과인 Relation을 다시 관계 대수 연산Relation으로 사용할 수 있다. 마치 연산의 결과를 다시 피연산자로 사용하는 것과 유사하다.
- ((1 + 1) + 1) : 1 + 1이라는 결과를 피연산자로 활용하는 것처럼 관계 연산에서 나온 Relation을 다시 관계 연산의 Relation으로 사용한다.
- 예: 물리학 학과의 교수 이름 찾기
- 먼저 학과 이름이 “Physics”인 레코드를 instructor relation에서 Selection 한 다음, 교수 이름에 해당하는 attribute인 “name”을 Projection(투영)하면 된다.
- 쿼리:
- Project operation(π)의 인수로 relation 이름 대신 표현식(σ_dept_name = "Physics" (instructor)을 사용
카테시안 곱 연산 (Cartesian-Product Operation)
지금까지 본 관계 대수 연산은 모두 1개의 relation에 대한 연산이었지만, 카테시안 곱은 두 개의 relation간의 연산에 해당한다.
- 카테시안 곱 연산 (×)은 두 relation(관계)의 모든 가능한 튜플 쌍을 결합한다.
- 예: instructor와 teaches 관계의 카테시안 곱
- 표기법: instructor × teaches
- 하나는 instructor relation에서, 다른 하나는 teaches relation에서 각 튜플 쌍을 구성한다.
- instructor 테이블에도 강사 ID가 있고, teaches 테이블에도 강사 ID가 있다. 강사 ID는 두 relation 모두에 나타나기 때문에, relation의 이름에 attribute을 첨부하여 이러한 attribute을 구별한다.
- relation.attribute
- 예:
- instructor.ID
- teaches.ID
참고) Cartesian을 카테시안 이라고 읽는 사람도 있고 카티션으로 읽는 사람도 있는데 같은거라고 알고 있으세용
Join Operation
카테시안 곱 instructor × teaches는 모든 가능한 튜플 쌍을 생성하기 때문에 카테시안 곱으로 만들어진 릴레이션에는 특정 과목을 가르치지 않는 교수 정보가 많이 포함되게 된다.
따라서 우리는 특정 과목을 가리치는 교수 정보만 조합하여 가져오고 싶은데, 이 때 사용하는게 Join Operation이다.
Join Operation에 해당하는 연산자가 따로 존재하긴 하지만, Join Operation을 사용하지 않고도 이전에 우리가 배운 연산자들을 가지고 우리가 원하는 결과를 얻어낼 수 있긴 하다.
하지만 이렇게 Selection과 Cartesian Operation 연산을 두 번해야 하기 때문에, 한 번에 처리할 수 있는 Join Opertation을 사용하는 것이다.
- 표기법:
- r과 s는 relation에 해당
- instructor, teaches
- theta는 선택 연산의 선택 조건 p에 해당한다.
- r과 s는 relation에 해당
- Join과 Selection, Cartesian과의 관계를 다음과 같이 나타낼 수 있다.
최종적으로
이 관계 대수 식을 다음과 같이 나타낼 수 있다.
Union Operation(합집합 연산)
Union Operation은 두 relation을 결합하는 연산이다.
잉? 두 relation 간에 결합하는 연산은 이미 위에서 다 배운거 아니에요? 라고 말할 수 있는데, 위에서 다룬 연산은 서로 같거나 or 다른 스키마를 가지는 relation간의 연산이었다. (instructor, teaches)
하지만 여기서부터 다룰 연산은 같은 스키마를 가지는 relation 간의 연산이라고 생각하면 된다.
- 표기법: r ∪ s
- r ∪ s가 유효하려면:
- r과 s는 동일한 수의 attribute을 가져야 함
- attribute 도메인이 호환되어야 함(must be compatible) (예: r의 두 번째 열(attribute)은 s의 두 번째 열(attribute)과 동일한 속성의 값을 처리)
- 예: 2017년 가을 학기 또는 2018년 봄 학기 또는 두 학기 모두에 가르친 모든 과목 찾기
- Tip) 관계 대수 식으로 표현하기 전에 다음과 같이 생각하면 좋다. (마치 프로그래밍 언어처럼)
- ((년도 == 2017) && (학기 = =가을)) || ((년도 == 2018) && (학기 == 봄)) 과목
- 선택 조건들을 나열한 다음 Projection할 Attribute를 적어주는 것이다.
- 이제 연산자만 적절하게 붙여주면 된다.
- 결과
- Tip) 관계 대수 식으로 표현하기 전에 다음과 같이 생각하면 좋다. (마치 프로그래밍 언어처럼)
Set-Intersection Operation(교집합 연산)
Set-Intersection 연산은 두 input relation 모두에 존재하는 튜플(행)을 찾는다
- 표기법: r ∩ s
- 가정: (Union 연산이랑 동일)
- r과 s는 동일한 수의 도메인을 가짐
- r과 s의 attribute는 호환됨
- 예: 2017년 가을 학기와 2018년 봄 학기 모두에 가르친 모든 과목 찾기
- 결과
Set Difference Operation(차집합 연산)
- Set Difference Operation은 한 relation에 있지만 다른 relation에 없는 튜플을 찾음
- 표기법: r - s
- r - s 와 s - r의 결과는 같지 않음에 주의하자.
- Set Difference는 호환되는 relation 간에 수행되어야 함
- r과 s는 동일한 arity를 가져야 함
- arity : 한 관계(relation) 또는 테이블이 몇 개의 속성(attribute)을 가지고 있는지를 나타낸다.
- r과 s의 attribute 도메인은 호환되어야 함
- r과 s는 동일한 arity를 가져야 함
- 예: 2017년 가을 학기에는 가르쳤지만 2018년 봄 학기에는 가르치지 않은 모든 과목 찾기
- 결과
정리
이번 챕터에서는 데이터를 추상화하여 모델링 하는데 사용하는 Data Model의 한 종류인 Relational Model(관계형 모델)을 다뤘다. Relational Model은 데이터를 표로 모델링하는 모델이다.
먼저 관계형 모델을 다룰 때 자주 등장하는 용어에 대해 다뤘다.
- 행(Row)
- 열(Column)
- 튜플(Tuple)
- 속성(Attribute)
- 키(Key)
- 관계(Relation)
- 도메인(Domain)
- 쿼리(Query)
- 인스턴스(Instance)
- 스키마(Schema)
데이터베이스에서 데이터를 삽입, 갱신, 삭제, 선택하는 것을 연산(Operation)으로 분류한다.
한 개 또는 두 개 이상의 Relation에서 이루어지는 Operation을 표현하는 언어인 관계 대수(Relational Algebra)에 대해 배웠다.
관계 대수에는 여섯 가지 기본 연산자가 존재했다.
- select: σ
- 주어진 선택조건을 만족하는 튜플을 선택
- project: π
- 원하는 Attribute만 가져온다
- 합집합 (union): ∪
- 차집합 (set difference): −
- 카테시안 곱 (Cartesian product): ×
- 두 relation(관계)의 모든 가능한 튜플 쌍을 결합한다.
관계 대수의 연산 결과(—> Relation) 를 다시 관계 대수의 Relation으로 사용할 수 있었다.
그 예시로 select로 원하는 튜플을 선택하여 구성된 Relation을 가져다가, project로 원하는 Attribute를 가져올 수 있음을 살펴보았다.
Cartesian 곱과 Select 를 한 번에 처리할 수 있는 Join Opertation에 대해 배웠다.
끝!
Ref) Database System Concepts - 7th edition (Abraham Silberschatz)
'DataBase > Concepts' 카테고리의 다른 글
[DataBase] 03. SQL(Structured Query Language)(4) (0) | 2024.10.11 |
---|---|
[DataBase] 03. SQL(Structured Query Language)(3) (0) | 2024.10.11 |
[DataBase] 03. SQL(Structured Query Language)(2) (0) | 2024.10.11 |
[DataBase] 03. SQL(Structured Query Language)(1) (0) | 2024.10.10 |
[DataBase] 01. Introduction (0) | 2024.10.10 |