관계형 모델

관계형 모델은 상업용 데이터 처리 응용을 위한 주요 데이터 모델입니다.

관계형 모델은 이전의 다른 모델과 비교했을 때 프로그래머의 작업을 더 쉽게 만들어 줄 수 있는 단순성으로 인해 아직까지 최고의 자리를 차지하고 있습니다.

 

1. 관계형 데이터베이스의 구조

관계형 데이터베이스는 테이블의 모임으로 구성되며, 각 테이블은 고유한 이름을 가지고 있습니다.

각 테이블은 데이터 필드를 나타내는 열들과, 각 필드에 대한 을 나타내는 행들로 구성되어 있습니다.

각 행은 일련의 값 사이의 관계를 표현합니다.

 

1.1 관계형 모델 구조

관계형 모델에서 테이블은 릴레이션, 열은 속성, 행은 튜플이라 합니다.

 

릴레이션에서 속성의 개수는 인수라 합니다.

 

릴레이션 인스턴스는 특정 시점에서의 릴레이션입니다.

 

※ DB에서의 스냅샷이랑 같은 의미입니다.(또는 데이터베이스 인스턴스)

 

릴레이션의 각 속성은 도메인이란 허가된 값의 집합을 가지고 있습니다.

예를 들어, 교수 릴레이션의 이름 속성의 도메인은 가능한 모든 교수의 이름입니다.

 

모든 릴레이션에 대해서 모든 속성의 도메인은 원자적이어야 합니다.

원자적 도메인이란, 도메인의 요소가 더이상 나뉠 수 없다는 단위라는 것을 의미합니다.

예를 들어, 전화 번호라는 속성이 존재한다고 하면, 번호는 원자적이지 않습니다.

왜냐하면, 전화 번호는 집 번호, 휴대폰 번호, 회사 번호 등의 부분 집합을 가지고 있기 때문입니다.

 

널(null) 값은 알려지지 않거나 존재하지 않는 값을 의미하는 특별한 값입니다.

데이터베이스의 해당 행과 열에 대한 데이터에 값이 존재하지 않으면 널 값이 들어갑니다.

 

※ 책에서는 가능하다면 널 값은 데이터베이스의 접근이나 갱신에 어려움을 주기 때문에 제거하는 것이 좋다고 합니다.

 

릴레이션 스키마는 속성과 그 속성이 가지는 도메인의 명세로 구성됩니다.

 

2. 키

주어진 릴레이션 안에서 튜플을 구별하는 방법이 있어야 합니다.

그러기위해, 튜플을 유일하게 식별할 수 있어야 하는 튜플의 속성값이 필요합니다.

 

2.1 슈퍼 키

한 릴레이션에서 그 튜플을 유일하게 식별할 수 있도록 해 주는 하나 혹은 그 이상의 속성들의 집합입니다.

예를 들어, 교수 릴레이션의 ID 속성이 튜플을 유일하게 식별할 수 있는 속성이라고 하면, ID뿐만 아니라 ID를 포함한 속성들의 집합이 슈퍼 키가 될 수 있습니다.

 

2.2 후보 키

모든 슈퍼키 중에서 최소한의 집합을 가진 슈퍼 키들이 후보 키가 될 수 있습니다.

위의 예제에서는 ID가 후보 키들 중에 하나입니다.

 

2.3 주 키(기본 키)

후보 키들 중에 데이터베이스 설계자에 의해 선택된 키가 주 키가 됩니다.

  • 주 키 제약 조건
    릴레이션의 어떠한 튜플도 같은 값을 갖는 주 키가 동시에 존재할 수 없다.

 

2.4 외래 키

하나의 릴레이션 A의 속성이 다른 릴레이션 B의 주 키라면, 그 속성이 외래 키가 됩니다.

이 때, A는 참조하는 릴레이션, B는 참조되는 릴레이션이라 합니다.

  • 외래 키 제약 조건
    참조하는 릴레이션의 각 튜플들의 특정 속성의 값(외래 키)이 참조되는 릴레이션의 어떤 튜플의 특정 속성(주 키)의 값으로 존재해야 한다.
  • 참조 무결성 제약 조건
    외래 키 제약 조건을 조금 더 완화한 것.
    참조하는 릴레이션의 어떤 튜플의 특정 속성의 값(외래키)이 참조되는 릴레이션에서 적어도 하나의 튜플의 특정 속성의 값(주 키)으로 존재해야 한다.

3. 스키마 다이어그램

데이터베이스 스키마는 주 키와 외래 키 종속성을 가지고 있는데, 이를 시각적으로 나타낸 것이 스키마 다이어그램이라 합니다.

 

일반 화살표는 외래키 제약 조건, 이중 화살표는 참조 무결성 제약 조건을 나타냅니다.

 

※ 다른 형태의 다이어그램 표기 방법으로 개체-관계 다이어그램(ERD)도 있습니다.

 

4. 관계형 질의어

질의어는 사용자가 데이터베이스로부터 정보를 요청할 때 사용하는 언어입니다.

 

질의어는 다음 3가지 언어로 구분할 수 있습니다.

  • 명령형 질의어 : 사용자가 원하는 결과를 계산하기 위해 데이터베이스에 특별한 일련의 연산을 수행하도록 명령합니다.
  • 함수형 질의어 : 계산은 데이터베이스에 있는 데이터나 다른 함수의 결과에 대해서 동작하는 함수의 실행으로 표현됩니다.
  • 선언형 질의어 : 사용자는 원하는 정보만 기술하며 이 정보를 얻기 위한 구체적인 단계나 함수 호출을 기술하지 않습니다.

    ※ 데이터베이스 엔지니어가 아니라면, 관계형 질의어에는 이런게 있구나하고 넘어가셔도 될 것 같습니다.

5. 관계 대수

관계 대수는 순수 질의어의 한 종류로 함수형 질의어입니다.

관계 대수는 한 개 혹은 두 개의 릴레이션을 입력으로 받아 그 결과로 새로운 릴레이션을 생성하는 연산들의 집합으로 구성됩니다.

 

선택, 추출, 재명명 연산은 한 릴레이션에 대해 수행하므로 단항 연산,

카티션 곱, 집합 연산은 한 쌍의 릴레이션에 대해 수행하므로 이항 연산이라 합니다.

 

5.1 선택 연산

선택 연산은 주어진 조건을 만족하는 튜플을 선택해줍니다.

예를 들어 속성으로 ID, 이름, 연봉을 가진 릴레이션에서 연봉이 4000이상으로 선택 연산하면 조건에 만족하는 튜플을 선택합니다.

 

5.2 추출 연산

추출 연산은 주어진 속성들만을 결과 릴레이션으로 돌려줍니다.

예를 들어 속성으로 ID, 이름, 직업, 연봉을 가진 릴레이션에서 ID, 이름 속성만을 추출 연산하면 속성이 ID, 이름만 있는 릴레이션을 반환해줍니다.

 

5.3 혼합 관계 연산

혼합 관계 연산은 선택 연산과 추출 연산을 혼합해서 사용한 연산입니다.

 

5.4 카티션 곱 연산

카티션 곱 연산은 한 쌍의 릴레이션의 결합된 릴레이션으로 돌려줍니다.

예를 들어, 2개의 튜플을 가지는 A 릴레이션과 3개의 튜플을 가지는 B 릴레이션이 있다고 하면,

A, B를카티션 곱 연산을 하면, A의 각 튜플은 B의 3개의 튜플 정보를 가지는 3개의 튜플로 늘어나고,

총 2 * 3 = 6개의 튜플을 가지는 새로운 릴레이션이 생깁니다.

 

※ 수학의 경우의 수에 비유하자면, 모든 경우의 수를 보여준다고 생각하시면 됩니다.

 

5.5 조인 연산

조인 연산은 카티션 곱 연산 후 선택 연산한 것입니다.

 

5.6 집합 연산

집합 연산에는 합집합, 교집합, 차집합 연산이 있습니다.

 

집합 연산을 하기 위해서는 다음 2가지를 만족해야 합니다.

  • 릴레이션 A, B는 같은 수의 속성을 가져야 합니다.
  • 릴레이션 A의 i번째 속성의 도메인과 릴레이션 B의 i번째 속성의 도메인은 서로 같아야 합니다.

위 2가지를 만족하는 릴레이션을 호환 가능한 릴레이션이라 합니다.

 

5.7 배정 연산

배정 연산은 일시적인 릴레이션 변수에 질의를 배정하는 것입니다.

 

5.8 재명명 연산

재명명 연산은 관계 대수식의 결과를 참조할 수 있는 이름을 갖게 해줍니다.

또한 동일한 릴레이션에 대해서 서로 다른 유일한 이름을 부여하는 데 사용될 수 있습니다.

 

5.9 동등 질의

질의를 관계 대수로 표현하는 데 한 가지 이상의 방법이 있을 수 있습니다.

즉, 서로 다르게 생긴 질의지만, 같은 결과를 내는 질의를 동등 질의라 합니다.

 

※ 동등 질의지만 효율은 다를 수 있기에 저는 더 효율이 좋은 질의를 선택할 수 있어야 된다고 생각합니다.

 

마치며...

이번 글은 관계 모델에 대해 정리한 글입니다.

 

저는 이번 공부에서

  • 관계형 모델의 구조는 어떤지,
  • 다양한 키와 제약 조건이 어떤 것이 있고 무엇인지,
  • 스키마 다이어그램이 무엇인지,
  • 관계형 질의어 종류에 어떤 것이 있는지,
  • 관계 대수이 무엇이고, 어떤 연산들이 있는지,

를 배웠습니다.

 

이번 공부에서 관계형 질의어 종류 같은 경우에는 이런 게 있구나 정도로만 넘어갔고, 추후에 보완할 필요가 있다면 보완할 것입니다.

그리고 저는 조인 연산이 막연하게 알고 있던 각 릴레이션 선택 후 합집합 연산이 아닌

카티션 곱 연산을 한 후에 선택 연산임을 알아 갔습니다.

 

'채워가는 지식 > DB' 카테고리의 다른 글

인덱스, 뷰, 조인  (0) 2024.04.18
ACID란?  (0) 2024.04.17
쿼리 최적화에 대하여...  (0) 2024.04.17
RDBMS와 NoSQL의 장단점  (0) 2024.04.17

+ Recent posts