PHP 프로그래밍

본문 바로가기
사이트 내 전체검색


Web Programming >> PHP Programming
[목차]
제17장 데이터베이스 기초 및 설계

    4. 관계형 데이타베이스 (Relational Database)

관계형 데이타베이스는 모든 데이타들을 테이블과 같은 형태로 나타내어 저장하는 데이타베이스입니다. 일상생활에서 데이타를 정리하여 표현할 때 흔히 표와 같은 방법을 사용하게 되는데, 관계형 데이타베이스는 이 '표'의 개념을 사용해서 데이타를 구성하는 방법을 사용하고 있습니다.

예를 들어 고객들의 주소와 전화번호를 정리할 때 표, 즉 테이블을 사용한다면, 첫번째 열은 이름, 두번째 열은 주소, 세번째 열은 전화번호를 써서 나타낼 수 있습니다.

개체-관계 모델에서 정의한 데이타들을 실제로 관계형 데이타베이스를 사용하여 저장하기위해서는 개체-관계 모델을 테이블로 변환시키는 과정이 필요합니다. 즉 개체-관계 모델은 실제 데이타베이스와는 상관없이 저장하고자 하는 데이타를 정의한 것이며, 테이블은 데이타를 관계형 데이타베이스에서 실제로 표현하는 방법입니다.

관계형 데이타베이스에서는 단순히 데이타를 테이블의 형테로 나타낼 뿐만아니라 저장된 데이타로부터 원하는 정보를 추출할 수 있는 방법을 정의하고 있습니다. 이 단원에서는 관계형 데이타베이스에서 테이블의 정의와 개체-관계 모델을 테이블로 변환시키는 방법, 그리고 데이타를 추출하기위한 방법을 다루고 있습니다.

4.4.1. 관계형 데이타베이스란 무엇인가?

4.4.1.1. 테이블의 정의

앞에서 예로 들었던 학사관리에 대한 데이타에서 학생에 관한 데이타를 살펴봅시다. 학생에 관해서 학번, 이름, 학과, 출생년도, 지도교수의 데이타가 있다고 할 때, 수백명의 학생들의 데이타를 정리하려면 보통 각 열이 학번, 이름, 학과 등의 값을 가진 표로써 정리할 것입니다.



즉 이 표에서 각행은 하나의 학생에 대한 데이타들의 묶음이 되고, 각열은 학생의 여러 속성들의 값을 나타내게 됩니다.

위의 예에서 볼 수 있듯이 여러가지의 속성을 가진 대상들의 데이타를 나열할 때 테이블의 형태로 생각하게 됩니다. 이렇게 나타내고자하는 대상의 속성들을 묶어 하나의 행을 만들고 이들 행들의 집합으로 데이타를 나타내는 것이 관계형 데이타 베이스입니다.

4.4.1.2. 데이타의 속성

관계형 데이타베이스에서 각각의 열은 대상의 속성을 나타낸다고 하였는데, 이들의 실제 값은 그 속성에 따라 다른 형태를 가지고 있습니다. 즉 학번항목에 올 수 있는 값은 가능한 모든 학번들 중의 하나이며 이름 항목에 올 수 있는 값은 학생들의 이름 중 하나입니다.

이렇듯 테이블의 각 열에는 올 수 있는 값의 범위와 종류가 정해져 있으며 table의 한 행은 각 항목의 가능한 값의 조합들중 하나가 됩니다. 이렇게 행의 각 항목이 가능한 값들로 이루어져 있는 행들의 집합을 관계(relation)이라고 하는데, 우리는 좀더 직관적으로 쉬운 테이블이라는 용어를 사용하겠습니다.

4.4.1.3. 데이타베이스 스키마

다시 학사관리 데이타베이스의 예로 돌아가서 보면 학생, 교수, 강좌등의 여러개의 테이블이 나올 수 있으며 데이타베이스를 설계하는 과정에서 이러한 테이블들을 정의를 해야합니다.

하나의 table을 정의하기위해서는 테이블의 열을 이루는 각 항목을 정의해야 하는데, 이렇게 각 항목을 정의하여 만든 테이블의 틀을 스키마라고 합니다. 즉 학생의 예를 보면 학생은 이름, 학번, 학과, 출생년도로 이루어져 있으므로 다음과 같이 틀이 만들수 있습니다.

학생 = (이름, 학번, 학과, 출생년도)

이와 같이 전체 데이타베이스에서 필요한 각각의 table을 정의하면 하나의 데이타베이스에 대한 틀이 만들어 지는데 이것을 데이타베이스 스키마라고 한다.

4.4.1.4. 테이블의 키 속성

한 테이블의 열들을 나타내는 속성들 중 행과 행을 구별할 수 있게하는 속성들이 있는데 이것이 그 테이블의 키가 됩니다. 즉 개체-관계 모델에서 보았던 것과 마찬가지로 학생 테이블에서 학번 속성은 키가 될 수있습니다. 한 테이블에서 키는 여러개가 있을 수 있는데 이중 사용하기에 편리한 것을 주된 키로 사용합니다.

이와 같이 우리가 일상생활에서 데이타를 생각할 때 쓰는 방식과 같이 테이블과 같은 형태로 데이타를 정의하는 것이 관계형 데이타베이스입니다. 다른 여러 장점을 제외하고도 이러한 개념적인 단순함과 명료함이 관계형 데이타베이스의 성공의 이유 중 하나가 됩니다.

4.4.2. 개체-관계 모델에서 테이블로의 변환

4.4.2.1. 개체-관계 모델과 테이블

개체-관계 모델은 데이타베이스를 설계하는 과정에서 저장하고자 하는 데이타들을 명확한 형태로 표현하여 데이타베이스의 사용자나 설계자들이 필요한 데이타가 무엇인가를 정의한 것입니다. 이러한 개체-관계 모델의 결과를 관계형데이타베이스로 구현하기위해서는 개체-관계 모델에서 정의된 데이타에 대한 요구를 관계형데이타베이스에서 정의되는 형태, 즉 테이블로 나타내어야 합니다.

개체-관계 모델에서 관계형 데이타베이스에서의 테이블을 정의하는 과정은 우선 각각의 개체를 하나의 테이블들로 구성하고, 그것들 사이외 관계를 별도의 테이블로 만들거나 또는 개체 테이블에 항목을 추가하여 만드는 두가지 단계를 거쳐야하는데, 각 단계에서의 방법은 다음과 같습니다.

4.4.2.2. 개체의 테이블로의 변환

개체-관계 모델에서 하나의 개체는 몇개의 속성을 가지고 이들 속성들의 값에 의해 특징지울 수 있습니다. 이들 개체의 속성들이 테이블들의 각 항목을 이루게 되며 하나의 개체가 테이블의 한 행을 해당됩니다. 예를 들어 강좌의 개체는 강좌 번호, 강좌 이름, 학점, 시간, 강의실의 속성을 가지고 있는데 이것을 테이블로 옮겼을 때, 강좌의 테이블은 다음과 같은 스키마를 가지게 됩니다.

강좌 = (강좌 번호, 강좌 이름, 학점, 시간, 강의실)

개체의 키는 테이블로 변환시켰을때에도 테이블의 키가 되는데 위의 예에서는 강좌번호가 강좌 개체의 키가 될 수 있으며, 이것이 강좌 테이블에서도 같이 키로써 쓰일 수 있습니다.

앞에서 든 학사관리 시스템의 예에서 각 개체에 대해 이들을 테이블로 변환시킨 결과는 다음과 같습니다.

4.4.2.3. 관계의 테이블로의 변환

개체-관계 모델에서 개체들 사이의 관계는 두 개체들이 가지고 있는 관련성을 나타내며 자체에도 관계의 속성을 가지고 있습니다. 즉 수강 관계는 학생과 강좌가 가지고 있는 관계를 나타내며 학점이라는 속성을 가지고 있습니다.

수강관계에서 관련된 두 개체는 학생과 강좌로써 이러한 수강관계를 테이블로 나타낸다면 이 수강이라는 관계에 관련된 학생과 강좌를 나타내는 항목이 필요합니다. 즉 개체-관계 모델에서의 관계를 하나의 테이블로 표현하기 위해서는 테이블에는 관련된 개체들이 무엇인지를 나타내는 항이 필요하게 됩니다.

이렇게 관계의 테이블에서 한 관계에 관련된 개체를 표시하게 위해서는 각 개체를 구별할 수 있는 값, 즉 개체의 키 속성을 사용해야 합니다. 앞의 예에서 수강 관계의 테이블을 만들기 위해서는 학생 개체의 키인 학번과 강좌 개체의 키인 강좌 번호를 사용하여 테이블을 만들 수 있습니다. 이러한 관계의 테이블을 보면 다음과 같이 나타낼 수 있습니다.

하나의 관계에는 관련된 개체들 뿐 아니라 관계 자체의 속성이 있으며 , 이러한 속성또한 관계 테이블의 하나의 항목이 되어야 합니다. 즉 수강관계의 예를 보면 학점 속성은 수강 테이블의 한 항목으로 추가 되어야 합니다.

즉 수강 관계를 테이블로 완전히 나타내면 다음과 같습니다.

수강 = (학번, 강좌번호, 학점)

위의 수강의 예를 다시 보면 수강관계는 M : N 관계임을 알 수 있습니다. 하나의 과목에 대해 여러 학생이 관계하며, 또 한 학생에 대해 여러 강좌과 관계됩니다. 이러한 경우 에 위에서 소개한 방법으로 나타낼 수 밖에 없습니다.

하지만 1:1의 관계나 1:N의 관계를 살펴봅시다. 예를 들어 학생과 교수사이의 지도 관계를 본다면 한 교수에 대해 여러 학생이 관련되지만 한 학생에 대해서는 한명의 교수 밖에 존재하지 않습니다. 이런 경우에도 (학번, 교수번호)의 테이블로 나타낼 수 밖에 없까요>

앞의 수강의 예에서 만약 학생의 테이블에 그학생의 강좌까지 추가하여 나타내어 봅시다. 아래의 그림과 같이 한 학생에 대해 강좌번호만 다르고 나머지는 같은 행이 반복되는 것을 볼 수 있습니다.

반대로 강좌의 테이블에 학생의 번호를 추가하여 수강관계를 나타내 보도록 합시다. 이 경우도 하나의 강좌에 많은 학생이 있기 때문에 강좌 테이블의 다른 속성 즉 강좌 이름, 시간, 강의실 등의 항이 반복됩니다.

이와 같은 같은 데이타를 중복해서 저장하는 것은 앞에서 다루었던 것처럼, 저장장소의 낭비뿐아니라 데이타의 일관성이 깨지는 결과를 초래할 수가 있습니다. 이처럼 M:N관계는 하나의 별개의 테이블로 나타낼 수 밖게 없습니다.

이번에는 학생, 교수의 지도 관계를 본다면, 한 학생에 대해서 하나의 교수밖에 관련되지 않습니다. 그렇기 때문에 지도 관계를 다른 테이블로 나타내지 않고 학생 테이블에 지도라는 항목을 추가하여 나타내더라도 아래 그림처럼 다른 데이타가 반복해서 나타나지 않습니다.

이처럼 1:N 관계를 테이블로 나타내는 경우에는 다른 개체에 대해 하나의 관계만을 가지는 개체쪽 (위의 예에서 학생쪽)의 테이블에 다른 개체의 키 속성을 다른 항목으로 추가하여 나타낼 수 있습니다. 1:1 관계의 경우는 어느 쪽이든 관계없이 서로에 대해 하나씩의 관계만을 가지므로 한쪽 개체의 키 속성을 다른 개체의 테이블에 추가하면 됩니다.

4.4.3. 관계형 데이타베이스에서의 데이타 추출 방법

4.4.3.1. 데이타의 추출

이전 단원에서 관계형데이타베이스에서 데이타를 표현하는 방식 즉 테이블을 사용한 방식과 객체-관계 모델을 테이블로 변환하는 방법을 다루었습니다. 그렇다면 어떻게 이러한 테이블로 표현된 데이타로 부터 원하는 정보를 추출할 수 있을까요? 관계형 데이타베이스에서는 데이타를 표현하는 방식뿐만아니라 데이타를 추출하는 방식또한 정의하고 있습니다.

이렇게 데이타베이스를 테이블로 나타내고 이 테이블에 대해서 데이타를 추출하기위한 연산들을 같이 정의함으로써 좀더 일관된 시각으로 데이타베이스를 설계할 수가 있습니다. 그러면 어떤 연산들이 필요하게 될까요? 가장 기본적인 연산을 다음과 같은 것들이 있으며, 이러한 기본연산들을 함께 연결하여 사용함으로써 복잡한 데이타를 추출할 수가 있습니다.

이러한 연산들에서 공통적인 것은 모든 연산의 결과는 새로운 테이블이 하나 생성된다는 것입니다. 예를 들어 출생년도가 1974년 이후인 학생의 이름과 학번을 구한다면 각 연산들을 사용하여 이름과 학번을 속성으로 가지는 학생의 테이블이 만들어질 것입니다.

4.4.3.2. SELETION : 조건을 만족하는 행을 고르기

학생의 테이블에서 학과가 전산학과이고 출생년도가 1975년 이후인 학생을 찾는 예를 본다면, 학생의 테이블에서 속성들 중에서 학과가 전산학과 이면서 출생년도가 1975년이후인 학생의 행을 찾아서 조건을 만족하는 행들을 모아 새로운 테이블을 만들 수 있습니다.

이처럼 테이블의 행들 중에서 주어진 조건을 만족하는 행을 뽑아서 새로운 테이블을 만드는 연산이 SELECTION입니다. 이 SELECTION 연산의 결과는 원래 테이블의 모든 속성들을 그대로 가지고 있는 테이블이며 행의 수가 원래 테이블 이하가 됩니다.

4.4.3.3. PROJECTION : 필요한 속성만 뽑아내기

위의 예에서 학생의 전체 속성이 필요하지 않고 이름, 학번만 필요하다고 합시다. 이때에는 필요한 속성들만을 가진 테이블이 필요하게 됩니다. PROJECTION 연산은 주어진 테이블에 대해 원하는 속성들만을 뽑아서 새로운 테이블을 만들어 내는 것입니다. 따라서 이 연산의 결과는 열의 수가 원래의 테이블이하인 테이블이 됩니다.

다시 앞의 SELECTION의 예에서 학과가 전산학과이고 출생년도가 1975년도 이후인 학생의 학번과 이름을 알고 싶다면, 먼저 SELECTION으로 조건을 만족하는 학생의 행의 찾아낸 다음 그 결과로 나온 테이블에 대해 PROJECTION연산으로 학생의 이름과 학번만을 열로 가지는 테이블을 만들 수 있습니다.


4.4.3.4. 집합 연산

집합의 연산으로는 합집합, 교집합, 차집합등의 연산이 있습니다. 이러한 연산을 테이블에 대해서도 적용할 수 있는데, 합집합은 두개의 테이블의 행들을 합쳐 새로운 테이블을 만드는 것이고 교집합은 두개의 테이블에 공통으로 있는 행들을 뽑아 테이블을 만드는 것입니다. 이러한 집합 연산이 가능하기 위해서는 연산의 대상이 되는 두 집합이 같은 속성즉 같은 열을 가지고 있어야만 하고, 연산의 결과로 나타나는 테이블또한 같은 속성을 가지고 있습니다.

4.4.3.5. JOIN : 두 테이블의 연결

학생이 듣고 있는 수강과목과 그 과목의 성적을 알고 싶을 경우 하나의 테이블만 검색했을 경우는 알 수가 없습니다. 이런 경우는 두개 또는 그이상의 테이블을 같이 사용해야 하는 데, JOIN은 이렇게 두 테이블사이의 연결을 시키는 연산입니다.

학생(학번 , 이름 , 출생년도, 학과 , 지도교수 )
수강(학번 , 강좌번호, 성적 )

위와 같이 테이블이 구성되어 있을 때, 한 학생에 대해 수가테이블에 있는 속성을 알고자 할 때는 학생 테이블의 한 행-- 즉 한 학생 -- 대해 이 행의 학번과 같은 수강 테이블의 행들을 모두 찾아내야 합니다. 이러한 과정을 학생 테이블의 모든 학생에 대해서 수행하면 학생과 수강데이타는 서로 연관될 수가 있습니다.

JOIN 을 좀더 자세히 살펴보면 두 테이블에서 공통된 속성 즉 위의 예에서 학번-- 이 같은 각 테이블의 행들을 합쳐 공통된 부분은 한번만 나타내어 테이블을 만드는 것입니다. 즉 위의 두 테이블을 JOIN하였을 때 다음과 같이 될 것입니다.

지금 까지의 연산들은 가장 기본이 되며 이들 연사들은 테이블로 부터 다른 테이블을 만드는 것이므로 중복해서 사용함으로써 복잡한 연산작업을 수행할 수가 있습니다. 이러한 연산은 여러가지 방법으로 표현되는데, 최근의 대부분의 데이타베이스관리시스템에서 사용하고 있는 SQL을 사용하여 이러한 연산들을 정의하는 방법을 아래에서 다루게 됩니다.

[목차]

개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.