What is (Relational) Data Model?
Relational database를 위한 이론적인 개념이다.
relation, attribute, tuble, key 등으로 구성되어 다음과 같은 특징을 가진다.
- Structure: DDL(Data definition language)를 사용하여 데이터 베이스 구조를 정의한다.(테이블 생성, 수정, 삭제를 수행하는 SQL언어 같은 거)
CREATE TABLE Students(sid: CHAR(20),name: CHAR(20),login: CHAR(10),age: INTEGER, gpa: REAL)
- Operations: DML(Data Manipulation language)를 사용하여 데이터를 관리한다.(삽입, 수정, 삭제, 조회 등)
INSERT INTO Students (sid, name, login, age, gpa) VALUES (53688, ‘Smith’,‘smith@ee’, 18, 3.2)
DELETE FROM Students S WHERE S.name = ‘Smith’
UPDATE Students S SET S.gpa = S.gpa – 0.1 WHERE S.gpa >= 3.3
Operations의 기능 중 Set-Oriented Semantics라는 중요한 개념이 있다.
집합 단위로 처리하는 방식으로 여러 개의 record(tuple)을 한꺼번에 처리한다.
SELECT * FROM Students S WHERE S.gpa >= 3.3 and S.aga < 25;
- Constraints: DCL(Data Control language)를 사용하여 데이터의 무결성을 유지한다.
- Domain Constraints: 각 속성이 특정 데이터 type을 가져야 한다.
- Key Constraints: 테이블의 각 행(튜플)이 Primary key를 가져야 한다.
- Intergrity Constrains: 데이터 간의 관계를 유지하고, 데이터의 논리적 일관성을 보장하는 역할을 한다.
Domain Constraints에 대해 살펴보면
DESC DEPT;
Dept라는 table을 보면 DEPNO, DNAME, LOC attribute으로 구성돼 있다.
각각 data type을 보면 정수형, 문자형, 문자형이다.
INSERT INTO DEPT VALUES ('XX', 'DATABASE', 'SUWON');
DEPT에 다음과 같이 값을 넣을 경우 오류가 뜬다.
정수형이 들어가야 할 자리에 문자형인 'XX'가 들어갔기 때문이다.
INSERT INTO DEPT VALUES ('50', 'DATABASE', 'SUWON');
반면 이 경우는 '50'이어도 숫자형이므로 알아서 50으로 입력된다.
Domain Constraints는 아니지만
INSERT INTO EMP VALUES(NULL, 'SIMON', 'DBA', 7902,TO_DATE('17-12-1980', 'DD-MM-YYYY'), 800, NULL, 50);
이 경우를 살펴보면 Primary key자리에 NULL을 입력하려 했기 때문에 error가 뜬다.
Relational Database
relational data model을 실제로 구현한 데이터베이스이다.
이 데이터베이스는 relations(table=2차원)의 집합으로 구성된다.
relation은 두 가지 요소로 구성되는데

- Schema(스키마)
table의 이름으로 구성돼 있고 각 열의 이름 및 데이터 타입을 포함하는 구조이다.
- Instance(인스턴스)
실제 데이터가 포함된 테이블로, 행(row)과 열(columns)로 구성되어 있다.
cardinality=6개(행의 개수), degree=5개(열의 개수)
table형태니깐 얼핏 보면 tabular model이라고 생각할 수 있지만 relational과 tabular는 다르다.
왜냐하면 tabular는 데이터에 좌표로서 행과 열로 접근한다.
반면 relational은 좀 더 수학적인 개념으로 그 순서가 중요하지 않다.
단지, attribute과 row기반으로 데이터에 접근한다.
또한 row들끼리 중복이 있으면 안 된다.
이런 점에서 relational model은 columns과 rows들이 바뀌어도 그 의미가 잘 바뀌지 않는다.
그럼 왜 이렇게 할까?
그것은 data independence를 달성하기 위해서이다.
물리적으로 위치가 바뀌어도 데이터 접근할 수 있기 때문이다.
Integrity Constraints(ICs)
IC는 database에서 어떤 instance들도 무조건 True인 상태여야 한다는 것이다.
IC는 데이터베이스가 현실세계의 규칙을 정확히 반영하도록 설계하는 것으로 무결성을 유지하고 잘못된 데이터를 허용하지 않는다.
IC는 어떻게 관리될까?
사용자 VS 응용프로그램 VS DBMS 중 어떤 것으로 관리해야 될까?
당연히 DBMS인데, 사용자가 직접 관리하면 유지보수가 어렵고 응용프로그램을 이용할 경우 수정해야 하는 번거로움이 발생한다.
DBMS이 자동으로 검사하면 데이터의 신뢰성이 높아진다.
IC는 DBMS에서 어떤 순서로 동작할까?
Schema 지정 시(테이블 지정 시) IC를 선언한다.
그 이후에도 활성화/비활성화가 가능하여 특정 시점에 따라 설정할 수 있다.
IC를 위반하는 update가 발생할 때, Error를 return 한다.
Transaction 중 IC Check를 동일하게 하는데, 즉각적으로 하거나 Defferred mode로 할 수있다.
Defferred mode일 경우, commit하기 전까지 미루다가 commit 이후에 전에 날렸던 query들의 IC를 확인한다.
여러 IC 중 가장 쉽고 흔한 Primary/foreign Key 동작부터 공부하겠다.
Primary Keys
Primary Key는 각 tuple(행)을 유일하게 식별하는 attribute(column)들의 집합이다.
Primary Key의 조건은
- 유일성(Unique): 두 개의 행이 같은 key값을 가질 수 없다. 즉, distinct 해야 함.
- 최소성(minimality): Key의 개수가 최소로 가져야 한다.
Key에는 Super Key, Candidate Key, Primary Key가 있다.
- Super Key: 행을 식별할 수 있는 column들의 집합이다.(pair로 존재할 수 있음)
- Candidate Key: Minimality를 만족하는 Super key이다.(불필요한 key들(=1개로 식별 못하는)은 제외시킴)
- Primary Key: Candidate Key 중 1개
Primary key constraint에 대해 예제를 통해 알아보자.
내가 임의로 table과 Primary Key를 만든다.
hello라는 table과 a라는 Primary key이다.
create table hello (a int, b char(1), primary key(a));
이러한 Constraint 정보를 확인하기 위해서는
select constraint_name from user_constraints where table_name = 'HELLO';
을 이용한다.
Oracle이 자체적으로 user_constraints라는 곳에 HELLO의 Constraint 정보를 저장하고 이름을 부여한다.
insert into hello values (1,'A');
insert into hello values (1,'A');
hello table에 1, 'A'를 두 번 연속으로 넣으려 하면 Primary Key인 1이 중복이 되므로 들어갈 수 없다.
다음로 이 query를 날리면
select index_name from user_indexes where table_name = 'HELLO';
자동으로 Primary key로 정한 column에 index가 형성된 것을 알 수 있다.
왜 생겼을까?
새로운 tuple이 입력될 때, Primary Key column에서 중복이 있는지 판단해야 한다.
이때, 일일이 다 비교하면 너무 오래 걸리기 때문에 index를 primary key에 대해 자동으로 부여하는 것이다.
Foreign Key
한 테이블이 다른 테이블을 참조하도록 설정된 키이다.
두 테이블 간의 관계를 유지하는 역할을 한다.
foreign key의 특징을 살펴보면
- Foreign key는 반드시 참조하는 테이블(Parent table)의 Primary Key를 참조해야 한다.
- Value 기반으로 relation을 유지한다.
- Foreign Key에는 Null값이 들어갈 수 있다.
- 단, Null값이 아닌 Value가 들어올 때는 반드시 참조하는 table의 primary key로 있어야 한다.
CREATE TABLE Enrolled(sid CHAR(20), cid CHAR(20), grade CHAR(2),PRIMARY KEY (sid,cid),FOREIGN KEY (sid) REFERENCES Students )
- foreign key가 있는 table을 Child table, foreign key가 참조하는 table을 Parent's table이라 한다.
- 이때 Parent's table의 foreign key가 참조하는 primary key도 index가 있어야 한다. 왜냐하면 child table에 새로운 row가 입력될 때, 이 foreign key의 value가 Parent's table의 Primary Key에 값이 있는지 확인해야 하기 때문이다.
- 같은 table의 primary key를 참조해도 된다.

- Parent's table의 Primary Key가 삭제되면 Child table의 Foreign Key는 어떻게 될까? 네가지 경우가 있는데 첫번째는 foreign key도 동일하게 지워주는 것이다. 두번째는 foreign key를 그냥 Null로 만드는 것이다. 세번째는 임시로 특정 value(default)를 할당하는 것이고 마지막은 Error를 띄워 못하게 한다.
CREATE TABLE Enrolled(sid CHAR(20),cid CHAR(20),grade CHAR(2),PRIMARY KEY (sid,cid),FOREIGN KEY (sid)
REFERENCES Students ON DELETE CASCADE ON UPDATE SET DEFAULT)
Delete뿐만 아니라 Update하는 것도 비슷하게 4가지이다.
'Computing' 카테고리의 다른 글
[C++] C++ Standard Library part2. File I/O streams / Strings / Containers (2) | 2025.03.19 |
---|---|
[빅데이터 및 지식관리시스템] View에 대해 알아보기 (1) | 2025.03.18 |
[C] Memory model(Stack vs Heap) (0) | 2025.03.17 |
[빅데이터 및 지식관리시스템] DBMS와 level of abstraction에 대해 알아보기 (1) | 2025.03.14 |
[C++] C++ Standard Library part1. I/O streams (0) | 2025.03.12 |