데이터베이스 #2 – 관계형 데이터 모델

관계형 데이터 모델(RDM;Relational Data Model)

관계형 데이터 모델은 현대 가장 많이 사용되는 데이터베이스 설계 모델이다. Postgres, MySQL, Oracle, MSSQL 등 이 있다. 이 모델의 이해를 통해서 데이터베이스의 정보 시스템 구축을 위한 설계 개념을 이해하는데 도움이 될 수 있다. 다음은 그 RDM의 구성 요소이다.

용어 정리

RDM은 관계라는 개념을 기반으로 한다. 관계는 어떤 실체들 간의 관계를 나타내는 2차원의 테이블이다.

엔티티(Entity)는 학생, 선생님, 자동차, 책 등과 같은 객체들의 추상화이다.

관계(Relationship)는 엔티티가 어떻게 상호 연결되는지에 대해 정의한다. 예를 들어 학생과 교실에서 학생은 반드시 하나의 교실에 소속되어야 한다면, 우리는 이 엔티티들의 관계를 다대일 관계라고 부를 수 있다.

관계는 속성(attribute)과 튜플(Tuple)로 구성된다. 아래 표를 보자.

학생 번호이름성별생년월일
20230503정규2010년 3월 5일

이 표에서 값을 정의하는 위 열 들을 속성이라고 한다. 그리고, 각 속성에 값들의 모임인 행을 튜플이라고 한다. 위 표의 경우, 20230503, 최, 정규, 남, 2010년 3월 5일 가 된다.

제한 사항(Restrictions)

관계형 데이터 모델의 ‘관계’는 다음과 같은 제약 사항이 있다.

  1. 데이터베이스에 동일 이름의 관계가 존재하면 안된다.
  2. 같은 관계내의 속성들은 다른 이름을 가져야 한다.
  3. 각 셀에는 하나의 값만 있어야 한다.
  4. 관계에서 행과 열의 순서는 중요하지 않는다.

엔티티의 무결성(Integrity)

무결성은 데이터 모델이 정해진 규칙에 부합하는 것이다. 무결성에는 엔티티 무결성과 참조 무결성 두 가지 종류가 있다.

엔티티 무결성은 테이블에서 두 개의 동일한 튜플(행)이 있을 수 없다는 것이다. 현실에서 절대적으로 동일한 물체는 없다는 것을 의미한다. 위에서 학생의 경우, 동일한 학생은 없도록 하는 무결성을 위해, 기본 키(PK)의 개념이 도입된다. 기본 키는 테이블의 각 레코드를 고유하게 식별하는 데 사용되는 필드 또는 필드의 집합으로, 두 개의 레코드가 동일하지 않도록 하는 것을 보장한다. 또한 특정 레코드에 효율적으로 접근할 수 있는 방법도 제공한다.

학생 번호(PK)이름성별생년월일반(FK)
20230503정규2010년 3월 5일20230201
학생

반(PK)담임 선생님교실번호교실전화번호
20230201김순희F04S0602-3333-4444
20230202이봉길F04S0702-3333-4445

위와 같은 환경에서 다음과 같은 신규 학생을 추가하는 경우를 생각해보자.

20230504규민2010년 6월 10일20230210

이 때, 반으로 입력하는 20230210이 반 테이블에 없는 경우, 우리는 학생의 엔티티 무결성을 해치는 경우라고 말할 수 있다.

참조 무결성

위에서 설명하는 테이블을 보면, 학생 테이블의 반의 속성(FK)이 반 테이블의 반 속성(PK)을 가리킨다. 이것은 하위 혹은 종속의 관계를 갖는다. 참조 무결성은 위와 같이 관계에서 기본 테이블의 튜플의 값중에 하위 테이블의 키를 참조하는 값이 존재하지 않는 경우 이 무결성을 위반하는 것이다.

위 테이블들의 관계에서 FK는 다대일(일대다) 관계를 만들어준다.

관계

앞서 일대다의 관계를 구성하는 테이블의 예를 보았다.

관계에는 다음과 같은 유형이 있다.

  • 일대일 관계(1-1) : 사람 – 주민등록증 과 같이 첫 번째 관계의 튜플 외에 다른 관계의 튜플이 연관될 수 없다.
  • 일대다 관계(1-M) : 학생 – 교실 같이 여러 튜플들이 소속되는 단일 그룹의 연관이 지정될 수 있다.
  • 다대다 관계(M-M) : 학생 – 공부 같이 여러 학생들이 다양한 공부를 할 수 있는 것과 같이 연관이 서로 하나 이상이 될 수 있다.

RDM은 다대다 관계가 존재하지 않는다. 구현은 두 개의 일대다 관계로 나뉘며 중간에 두 테이블의 기본키들을 외래키로 하는 연관 테이블이 구성된다.

장단점

RDM의 대중화를 이끈 기능은 쿼리 언어 SQL이다. 하지만, 최신 데이터베이스들에 비해 볼륨 확장성이 떨어질 수 있고, 중간 번역 계층 때문에 코드 복잡성이 증가될 수 있다.