**현재 듣고 있는 DB수업에 교재 + 개인적으로 읽고 있는 교재를 합쳐서 정리해보았다.**
다음과 같은 instructor 테이블이 있다고 가정해보자.
DB 설계할 때 속성(attribute, column)이 무엇인지를 파악해야한다.
Relation model에서 사용하는 단어들을 알아보자.
각 열을 속성(attribute)라고 한다.
각 행을 tuple이라고 한다. 그리고 이 튜플 간 순서는 무의미하다.
만약, 같은 튜플과 속성을 갖고 있는데 순서가 다르더라도 두 테이블은 같은 테이블 일 것이다.
테이블은 relation이라고 한다.
relation schema는 릴레이션에 어떤 정보가 담길지를 정의한다.
식으로 나타내면 A1, A2, ..의 attribute가 있을 때 R = (A1, A2 ..)를 말한다.
이것을 통해 몇개의 column이 있는지 유추할 수 있다.
그에 반해 relation instance는 relation schema에 실제로 저장된 데이터의 집합이다. 표로 한번에 살펴보면 다음과 같다.
domain은 각 속성들이 가질 수 있는 값의 집합을 의미하는데, 프로그래밍 언어에서 변수의 타입을 지정하는 것과 비슷하다고 보면 된다. 예를 들면 도서 이름의 도메인은 문자 집합일 것이다.
릴레이션에 있는 속성들은 atomic해야 한다. 이 의미는 두 가지가 있다.
- 하나의 속성은 한 값만 가져야 한다. 동시에 여러 값을 가질 수는 없다. 예를 들어 도메인이 전화번호일 경우, 한 사람의 전화번호가 두개가 될 수는 없다.
- 한 정보에서 다른 값의 정보를 추출하면 안된다. 전화번호를 예로 들어보면, 하나의 전화번호에서 지역 번호, 국가번호로 나누게 되면 해당 속성은 원자적이지 않다. 그러나 나누지 않는다면 원자적일 것이다.
null값은 unknown의 의미를 지닌다. 모든 속성의 값으로 올 수 있으나, 최대한 테이블에 널값이 없도록 해야한다. 왜냐하면 여러 작업을 계산할 때 문제가 있을 수 있다.
밑에 있는 두 개념을 잘 구분해야 한다.
Database schema: 데이터베이스의 논리적 설계
Database instance: 어떤 한 순간의 데이터 스냅샷
ralation schema : 그 속성과 속성이 가지는 도메인으로 구성된다. (프로그래밍 언어에서 형 정의)
relation instance: 프로그래밍 언어에서의 변수의 값
-> 인스턴스의 튜플은 시간에 따라 변할 수 있지만, 스키마는 변하지 않는다. 예시는 다음과 같다.
Key (중요한 파트)!
키는 속성들의 부분 집합이며, 어떠한 것을 식별한다는 의미가 있다. 그중에서도 super key(슈퍼키)는 튜플을 unique하게 식별할 수 있는 키를 의미한다. 예를 들어 위 릴레이션에서, ID는 super key가 될 수 있따. 아이디는 사람마다 독립적으로 주어지기 때문이다. 반면 이름의 경우 동명이인이 있는 경우 튜플을 유일하게 식별할 수 없을 것이다. {ID, 이름} 또한 슈퍼키일 것이다. ID로 튜플을 식별할 수 있기 때문이다. 즉 위 릴레이션에서는 ID 혹은 ID를 포함한 집합일 때 슈퍼키가 된다. 역으로 단독일 때는 슈퍼키가 아니지만 여러 키의 조합으로 슈퍼키가 되는 경우도 있다.
Candidate Key (후보 키)
효율성을 위해서 우리는 최소한의 슈퍼키가 필요하다. K의 개수가 minimal할 때 슈퍼키가 후보키가 된다. 만약 {ID}도 수퍼키고, {ID, name}도 수퍼키인 경우 {ID}가 후보키이다. (여기서 name은 불필요한 속성이다}
만약 name + dept_name이 항상 식별가능하다고 가정할 때, 이 테이블에서 후보키는 두개가 된다. {ID}, {name, dept_name}
Primary key (기본 키)
후보 키가 여러 개일 경우, 후보 키 중 하나를 선정하여 대표로 삼는 키를 기본 키라고 한다. 후보키의 사이즈가 다른 것이 여러 개가 있을 경우, 보통 사이즈가 더 작은 것을 primary key로 한다. 이것은 선택 사항이며, 기본 키의 선택 조건은 상황에 따라 다를 것이다.
Foreign key (외래 키)
다른 릴레이션의 기본 키를 참조하는(참조되는 것이 아닌, 참조하는 것임을 알아두자.) 속성을 의미한다. 이를 통해 릴레이션 간의 관계를 표현할 수 있다.
Foreign key constraint (외래 키 제약 조건 )
데이터 일관성을 위해서는, Referencing relation (참조하는 릴레이션)와 Referenced relation (참조되는 릴레이션)의 도메인이 동일해야 하며, 둘다 동일한 값으로 존재해야 한다. 이것을 일반화하면 Referential integrity constraint이며, integrity constraint (무결성 제약 조건)의 일부라고 볼 수 있다.
이러한 스키마 다이어그램을 보고, 어떠한 속성이 foreign키인지 알 수 있어야 할 것이다. 기본 키는 밑줄이 쳐져 있다. s_id는 주요키이면서도 외래 키인 (student의 기본키이므로) 예시이다. 또한 teaches 테이블을 보면 4개의 속성이 모였을 때에만 외래 키의 역할을 수행한다.
Relational Query Languages
1장에서도 나왔던 절차식 언어와 비절차식 언어가 나온다.(Procedural versus non-procedural) 절차식 언어는 원하는 결과를 얻기 위해 어떠한 연산을 수행할지 사용자가 시스템에 알려주지만, 비절차식 언어는 무슨 정보를 원하는지만 말한다.
3개의 쿼리어가 있다 .(쿼리어: 사용자가 데이터베이스로부터 정보를 요청할 때 사용하는 언어)
- Relatinal algebra
- Tuple relational calculus
- Domain relational calculus
그중에서도 Relational algebra (관계 대수)는 어떤 데이터를 어떻게 찾는지에 대한 처리 절차를 명시하는 절차적인 언어이다. SQL 쿼리 언어의 이론적인 기반을 제공한다. 우리는 이번 챕터에서 이에 대해 살펴볼 예정이다. 6개의 기본적인 operation으로 이루어져 있으며 Turing machine equlvalent하지 않다. 6개의 기본 연산은 다음과 같다.
1. Select Operation : 말 그대로 릴레이션에서 조건에 맞는 튜플을 선택한다. 다음과 같이 사용할 수 있을 것이다.
여기에서 dept_name = "Physics"를 selection predicate라고 한다.
selct operation에서는 여러 비교 연산자를 사용할 수 있으며, 비교 대상은 꼭 숫자가 아니라 속성들 끼리도 이루어질 수 있다. 또한 조건이 여러 개인 경우 and, or, not 기호를 이용할 수 있다. 그러면 다음과 같은 예시가 된다.
2. Project Operation - 릴레이션의 속성을 추출하기 위한 연산이다. 다음과 같은 예시를 들 수 있겠다.
아래부터는 집합 연산이며, 모두 두 릴레이션을 합하여 하나의 릴레이션을 만든다는 공통점이 있다.
3. Cartesian-Product Operation (카티전 프로덕트)
두 릴레이션을 연결시켜 하나로 합치는 연산이다. 다음과 같은 기호를 사용한다.
두 릴레이션의 같은 이름의 속성이 있는 경우, 릴레이션 이름을 옆에 붙여 구분하도록 한다. 다음 예시를 보면 한눈에 이해가 갈 것이다.
4. Join Operation
두 개 이상의 테이블 중 공통 속성을 기준으로 결합하여 새로운 테이블을 만드는 연산이다.
기존 카티전 프로덕트는 모든 경우의 수를 조합하기 때문에, 불필요한 정보를 포함하고 있을 확률이 높다. 예를 들어 위 테이블을 보면 특정 과목을 가르치지 않은 강사의 정보 또한 포함하고 있다. 따라서 위 연산에서 우리가 원하는 실제 값들을 원하려면 추가적으로 두 테이블 간 일치하는 ID값을 기준으로 해야할 것이다.
즉, 조인 연산은 카티전 프로덕트를 한 후 추가적으로 셀렉션 연산을 한, 기본 연산자의 조합으로 이루어져 있으며, 다음과 같은 기호(theta)를 사용한다.
조인 연산은 두 릴레이션의 속성이 동일한 도메인이어야 한다. (카티전 프로덕트는 꼭 동일할 필요는 없다) 내부조인(inner join), 외부조인(outer join), 교차조인(cross join) 등의 종류가 있다. 이후 더 자세하게 살펴볼 것이다.
5. Union Operation (합집합)
두 릴레이션이 서로 같은 속성 순서로 이루어져 있어야 한다. 이 연산을 수행하면 중복되는 값을 제외하고 합친 결과를 얻을 수 있을 것이다.
6. Set-Intersection Operation (교집합)
서로 합병 가능해야 하며, 동일한 속성 순서를 가져야 한다. 두 릴레이션이 공통으로 가지고 있는 튜플을 반환한다.
7. Set Difference Operation (차집합)
첫 번째 릴레이션에는 속하고, 두 번째 릴레이션에는 속하지 않는 튜플을 반환하며 이 연산 또한 합병 가능(도메인이 같아야 하고, 속성 순서가 같아야 하는 등..)해야 한다.
8. Assignment Operation
표현식의 일부를 임시 변수에 할당하는 것을 의미한다. 프로그래밍 언어에서 변수 의미와 비슷하다고 보면 될 것 같다.
연산이 끝나면 지워진다.
위 이미지와 같이 화살표 기호를 사용한다. 물리학과와 음악학과의 합연산을 진행하면서 물리학과 집합과 음악학과 집합을 임시적으로 저장해둔다. 이를 통해 sequential program처럼 동작하도록 할 수 있다.
9. rename operation
relational-algebra의 결과들은 이름이 지정되어 있지 않다. 거기에 우리가 이름을 부여할 수 있다. p라는 기호를 사용한다.
10. Equivalent Queries
쿼리를 쓰는 방식은 하나 이상인 경우가 많다.
쿼리 자체가 동일하지는 않아도 같은 결과를 주면 equivalent하다고 한다.
두 쿼리는 쿼리 자체가 동일하지는 않아도 같은 결과를 낸다. (not identical, equivalent)
최대한 효율적으로 짜려고 노력해야 할 것이다.
Composition of Relational Operations
단항 연산자들을 합쳐서 더 복잡한 연산을 할 수가 있다. 예를 들면 다음과 같다.
chapter 2 끝!
챕터 2의 목적은 키의 종류를 잘 구분할 수 있어야 하며, 원하는 조건에 맞추어 적절하게 relational algebra를 사용해서 쿼리문을 작성할 수 있어야 한다.
'데이터베이스시스템' 카테고리의 다른 글
[데이터베이스시스템] Chapter 4 : Intermediate SQL (0) | 2023.04.24 |
---|---|
[데이터베이스시스템] Chapter 3: Introduction to SQL (0) | 2023.04.22 |
[데이터베이스시스템] Chapter 6: Database Design Using the E-RModel (0) | 2023.04.21 |
[데이터베이스시스템] Chapter 1: Introduction (0) | 2023.03.12 |