간단 지식/Database

03. 관계형 데이터베이스 (Relational Database)

납작한돌맹이 2020. 1. 15. 20:11
반응형

원래는 이번 글에서 3단계 데이터베이스와 사상, DDL, DML, DSL, DCL, DBA, DBMS의 구성요소에 대한 내용을 설명하려 했다. 알면 좋은 개념들이긴 하지만 핵심만 기록하고자 하는 이 블로그에 기록할 정도는 아니라고 판단해서 곧장 관계형 데이터베이스로 넘어왔다. 혹시라도 위에 언급한 개념들에 대해 궁금한 점이 있다면 댓글로 물어보면 답해주겠다.


빠른 습득을 위해 mysql을 먼저 배운 사람이 있다면, 그리고 자신이 어느 정도 sql문을 짤 줄 안다고 생각하면 오산이다. 그 무엇보다도 관계형 데이터베이스(RDB)가 뭔지 알아야 DB 세계의 초입에 발을 뗀 것이라고 생각한다.

 

데이터베이스면 데이터베이스지, 관계형이라는 수식어가 왜 붙었는지 궁금했다.

일단 관계형 데이터베이스는 관계형 데이터 모델에서 기인했다. 이는 수학 이론에서 시작한 것인데 이는 생략하고, table 구조로 데이터를 표현하는 모델이라고 생각해주면 된다. 일반적인 table 개념과는 달라서 용어 정리를 간단히 하겠다.

테이블의 행(row or record) = RDB의 투플(tuple)

테이블의 열(column or field or item) = RDB의 속성(attribute)

 

이해를 위해 간단한 relation을 만들어 보았다.

제품번호 이름 가격 카테고리
1 콜라 1000 식품
2 휴지 500 생필품
3 라면 800 식품
4 오렌지 3000 식품
5 물티슈 2000 생필품

여기서 초록색 칸인 제품번호, 이름, 가격, 카테고리가 attribute이다. 그리고 그 외의 행 하나하나가 각각 tuple이 된다.

즉 attribute는 4개, tuple은 5개인 것이다.

또한 attribute의 개수를 relation R의 차수, 투플의 개수를 카디널리티 라고 부른다.

추가적으로 알아야 하는 점은, 한 관계 내에서 attribute들의 이름은 서로 달라야 한다는 것이다. 그리고 도메인에 대해 잠깐 언급하자면 도메인은 attribute가 취할 수 있는 모든 값들의 집합이다. 예를 들어 attribute '이름'의 도메인은 {콜라, 휴지, 라면, 오렌지, 물티슈}이다.


DB를 배운 사람이라면 위 테이블을 테이블이라 부르지 않고 relation이라고 불러야 한다. 이제 우리는 relation이 무엇인지는 위의 예시를 통해 대강 알게 되었다. 그런데 이 정도 지식으로는 누군가가 relation이 무엇인지 물어봤을 때 답하기가 애매모호하다.

좀 더 자세하게 개념을 건드려보면, relation은 수학적 정의와 개념적 정의로 구분할 수 있다.

수학에서의 relation은 카티션 프로덕트의 부분집합이다.

DB로 끌고온 relation의 개념은 relation schema + relation instance이다.

전자도 알아두면 좋지만 생략하고, 우리가 조명할 부분은 후자이다.

 

relation schema

relation intension 이라고도 부른다.

relation의 이름과 일정 수의 attribute 집합으로 구성

ex) relation R의 attribute집합이 A1, A2,... , An이라면 R(A1, A2,... , An)으로 표기

relation의 논리적 구조를 정의

시간에 무관한 정적 성질을 갖는다.

 

relation instance

relation extension 이라고도 부른다.

어느 한 시점에서 relation이 갖는 투플들의 집합

사용자가 투플을 삽입, 삭제, 변경할 수 있기 때문에 동적 성질을 갖는다.

 

여기서 좀 더 확장해보면 DB schema는 RDB의 논리적 구조를 정의하고 정적 성질을 갖고, DB instance는 어느 한 시점에서의 RDB에 저장된 데이터 전체를 말하며 동적 성질을 갖는다.


이제 우리는 relation이 무엇인지 물어본다면 대답할 수 있게 되었으니, 그 특징에 대해서도 알아야 되지 않겠는가? 

특징은 크게 4개로 쪼개 볼 수 있다.

1. 투플의 유일성

2. 투플의 무순서성

3. attribute의 원자성

4. attribute의 무순서성

투플의 유일성은 한 relation에 포함된 투플들은 서로 상이하다는 것이다.

투플의 무순서성은 한 relation에 포함된 투플 간에는 순서가 없다는 것이다. 즉 위의 예시로 가져온 relation의 투플들이 순서가 서로 바뀌어도 동일한 relation이라는 의미이다.

attribute의 원자성은 모든 attribute의 값은 논리적으로 분해할 수 없다는 의미이다. 만일 attirbute가 복수의 값을 갖는 비정규화 relation이라면 분해를 통해 정규화를 해야 한다. 참고로 null값은 정보의 부재를 명시적으로 표현한 것으로, 원자 값이다. ex) attribute 과목성적 --분해-> attribute 과목번호, attribute 성적

attribute의 무순서성은 attibute 간에는 순서가 없다는 것이다. 따라서 '첫 번째 attribute는 제품번호이다' 라는 말은 말하고자 하는 바를 이해는 할 수 있지만 틀린 말이다.


이제 알아야 하는 기본적인 개념을 모두 알았으니 relational database(관계형 데이터베이스)에 접근해보자.

관계형 데이터베이스는 쉽게 말하자면 relation들의 집합인데, 조건이 있다. 예시로 가져온 RDB를 보고 추측해보자.

 

relation name: student

sno sname year dept
100 소현 4 컴퓨터공학과
200 뫄뫄 1 영어영문학과
300 묘묘 3 기계공학과
400 띠띠 3 부동산학과
500 나나 2 수학과

relation name: course

cno cname credit dept
1 대학영어 2 영어영문학과
2 java 프로그래밍 3 컴퓨터공학과
3 인공지능 3 컴퓨터공학과
4 공학수학 2 수학과
5 기초기계공학 3 기계공학과
6 부동산세법 3 부동산학과

relation name: enroll

sno cno grade midterm final
100 1 B 75 70
100 3 A 80 95
200 1 A 90 90
300 1 C 50 45
300 4 B 65 80
300 5 A 80 95
400 1 C 30 65
400 6 B 70 80
500 4 B 85 55

알아차린 점이 있는가?

enroll에 있는 attribute sno와 cno가 student, course에도 있음을 발견할 수 있어야 한다. 그리고 그들 간의 참조 관계를 눈치챌 수 있어야 한다. 중복된 값들이 있는 enroll이 참조하는 relation이고, 그렇지 않은 student와 course가 참조되는 relation이다.

relation database

위 그림처럼 모든 relation이 단절되지 않고 참조/피참조 관계를 가져야 올바른 RDB라고 할 수 있다.

지금이야 간단한 예시를 위해 소규모의 데이터베이스를 만들어본 거지만, 실제로 쓰이는 데이터베이스는 규모가 매우 크기 때문에 관계가 끊긴 것을 발견하기 힘들 수도 있으니 명심해야 한다.


지금까지 배운 relation은 DB에서 데이터의 중복성 문제를 해결하기 위해 생긴 개념이다. 이제 다음 글에서는 실제로 RDB를 설계하고 mysql을 작성하기 위해 필요한 지식들을 정리할 것이다.

 

 

(이 글이 도움이 됐다면 광고 한번씩만 클릭 해주시면 감사드립니다, 더 좋은 정보글 작성하도록 노력하겠습니다 :) )

반응형