-
DBMS
데이터를 CSV처럼 관리한다고 생각해보자.
Artist(name, year, country) "A", 1992, "USA" "B", 1990, "KOREA" "C", 2000, "KOR" Album(name, artist, year) "song 1", "a", 1993 "song 2", "B", 1980 "song 2", "B", 1980
이런 경우 다음과 같은 문제가 발생할 수 있다.
1. country 이름의 일관성이 없다.
2. Artist 테이블에 없는 사람의 곡이 Album 테이블에 있을 수 있다.
3. 사람이 태어나기도 전에 곡이 있는, 논리적으로 맞지 않는 상황이 있을 수 있다.
4. 중복된 데이터가 존재할 수 있다.
등등, 그저 문자로 데이터를 관리하면 무결성, 유지보수 측면에서 좋지 않다.
따라서 DBMS(DataBase Management System)을 이용하는 것이 바람직한 방법이다.
Relational Model
관계형 모델은 데이터베이스 추상화를 정의하는 것으로,
유지보수의 오버헤드를 최대한 줄이기 위해 관계를 기반으로 데이터베이스를 추상화 한다.
(그래서 (관계형) 테이블을 Relations 라 부르는 듯)
용어를 정리하자.
- relation
Artist relation으로 unordered set 이다.
즉, 아래 tuple(데이터)들의 순서가 상관없는 집합이 relation, table이다.
단, set이기 때문에 모든 tuple들은 유일성이 보장되야 한다.
- tuple
relation의 행 하나하나를 tuple라 하며, ordered set 이다.
즉, attribute들의 순서가 중요한 집합이 tuple, domain, entity 이다.
- attribute
relation의 열(column)들의 이름을 말한다.
즉, name, year, country 가 이에 해당한다.
단, 각 attribute는 atomic 해야한다.
atomic
더이상 쪼개질 수 없다는 뜻으로,
attribute는 여러 데이터를 갖으면 안된다는 뜻이다.
예로 들어 name attribute에 데이터로 "a, b" 와 같이 여러 데이터를 저장하면 안된다는 뜻이다.
(a 그리고 b 로 해석되면 안됨. 그냥 순수하게 a, b로 저장하고 싶은 경우는 상관없음)Relational Algebra
검색을 위한 기본적인 연산자로 relation에서 tuple을 조작한다.
이 테이블을 기준으로 위 연산자의 예시를 들어보고
sql 문법으로 어떻게 변환되는지 살펴보자.
1. Select
R relation 에서 predicate 조건에 맞는 tuple만 포함된 부분집합을 찾는다.
아래 sql 문법에서 WHERE절에 해당한다.
SELECT * FROM R WHERE a_id = 'a2' AND b_id > 102;
2. Projection
R relation 를 기반으로 A1, A2, ..., An attribute가 포함된 relation을 만든다.
아래 sql 문법에서 SELECT절에 해당한다.
SELECT b_id-100, a_id FROM R WHERE a_id = 'a2';
3. Union
R, S relation 의 모든 tuple을 갖는 relation을 만든다.
단, 중복되는 tuple은 하나만 추가된다.
또한, Union에 사용되는 모든 relation은 attribute 수와 순서, 데이터 형식이 같아야 한다.
아래 sql 문법에서 UNION에 해당한다.
(SELECT * FROM R) UNION (SELECT * FROM S)
4. Intersection
R, S relation 양쪽에 동시에 존재하는 tuple만을 갖는 relation을 만든다.
단, Intersection에 사용되는 모든 relation은 attribute 수와 순서, 데이터 형식이 같아야 한다.
아래 sql 문법에서 INTERSECT에 해당한다.
(SELECT * FROM R) INTERSECT (SELECT * FROM S)
5. Difference
R relation에는 있지만, S relation에는 없는 tuple만을 갖는 relation을 만든다.
단, Difference에 사용되는 모든 relation은 attribute 수와 순서, 데이터 형식이 같아야 한다.
아래 sql 문법에서 EXCEPT에 해당한다.
(SELECT * FROM R) EXCEPT (SELECT * FROM S)
6. (Cartesian) Product
R, S relation을 모든 가능한 조합으로 합친 relation을 만든다.
아래 sql 문법에서 JOIN 또는 , 에 해당한다.
SELECT * FROM R JOIN S; -- or -- SELECT * FROM R, S
7. Join
R, S relation사이에 같은 relation에서 같은 값을 갖는 tuple을 포함하는 relation을 만든다.
즉, Product 연산 후 Select 연산을 하는 것과 동일한 결과이다.
아래 sql 문법에서 NATURAL JOIN 또는 JOIN - USING에 해당한다.
SELECT * FROM R NATURAL JOIN S; -- or -- SELECT * FROM R JOIN S USING (a_id, b_id);
+8. Assignment
기본 연산자는 아니지만, 연산된 relation을 이름을 지어 표현할 수 있게 해준다.
+9. Rename
기본 연산자는 아니지만, 표현식 E를 x 라는 이름으로 바꿔준다.
Relational Database
대부분은 Relational Model에서 나온 용어를 공유하지만, 추가적으로 아래의 용어를 정리해보자.
- schema
짧게 요약하면 자료의 구조, 형식, 관계를 정의한 것.
개발자에 따라 스키마를 바라보는 관점이 달라 3단계로 분류되기도 한다.
schema는 다음과 같이 추상적으로 표현될 수 있다.
relation_or_table(id, attr1, attr2)
여기서 attribute의 순서가 중요하다. 순서가 다르다면 같은 attribute로 이루어졌다고 해도 다른 테이블이 된다.
- key
attribute의 부분집합을 key라고 한다.
{id}, {attr1}, {attr2}, {id, attr1}, {id, attr2}, {attr1, attr2}, {id, attr1, attr2}
- superkey
key 중 tuple의 유일성을 보장할 수 있는 key만이 superkey가 된다.
{id}, {id, attr1}, {id, attr2}, {id, attr1, attr2}
- candidate key
superkey 중 tuple의 유일성을 보장하는데 있어 불필요한 attribute가 없는 superkey만이 candidate key가 된다.
{id}
- primary key
candidate key 중 하나만이 primary key로 사용되어 tuple을 구분하는데 사용하게 된다.
불변성이 보장된 candidate key를 선택하는 것이 좋다.
- foreign key
key 중 다른 테이블 schema에 존재하는 key.
즉, key의 값을 강제할 수 있다.
'대학 > 데이터베이스' 카테고리의 다른 글
Database Storage (2) 2023.06.03 Normalization (0) 2023.06.03 Database Design using E-R model (0) 2023.04.15 SQL 중급 (0) 2023.04.15 SQL 입문 (1) 2023.04.12