╱╱╭╮╱╱╱╱╱╱╭━━━╮╱╱╱╭╮╱╭╮╱╱╱╱╱╱ ╱╱┃┃╱╱╱╱╱╱┃╭━╮┃╱╱╱┃┃╱┃┃╱╱╱╱╱╱ ╱╱┃┣━━┳━━╮┃┃╱┃┣━╮╱┃╰━╯┣━━┳━╮╱ ╭╮┃┃╭╮┃┃━┫┃╰━╯┃╭╮╮┃╭━╮┃╭╮┃╭╮╮ ┃╰╯┃╭╮┃┃━┫┃╭━╮┃┃┃┃┃┃╱┃┃╭╮┃┃┃┃ ╰━━┻╯╰┻━━╯╰╯╱╰┻╯╰╯╰╯╱╰┻╯╰┻╯╰╯

Data Base/Data Base 기초

[DB] 관계형 데이터베이스 개념, 생성 (RDBMS)

재안안 2022. 7. 3. 03:50

관계형 데이터베이스란?

다양한 데이터베이스의 종류중 가장 많이 사용되고 있는 특정 종류이다.

 

서로 관련된 데이터끼리 분류해서 테이블에 저장하는 방법이다.

관계형 데이터베이스 모델을 보면 그냥 2차원 배열처럼 보인다. 이때 2차원 배열에서 행은 value, 열은 key를 나타낸다.   

 

사실 관계형 데이터베이스 테이블을 바로 보는 편이 이해가 빠르다.

 

개인적으로 진행한 todo list 프로젝트의 데이터베이스를 통해 설명을 하겠다.

해당 프로젝트를 간단하게 설명하자면 회원가입 후 각자 개인적인 task를 메모하는 서비스를 구현하는 것이다.

 

각 사용자들이 회원가입시 기입한 정보와 tasks를 DB에 저장한다.

 

user 테이블은 각 사용자가 회원가입시 입력한 정보를

todos 테이블은 각 사용자가 저장한 tasks를 저장한다.

 

user 테이블을 먼저 설명하겠다.

 

참고로 예제엔 HeidiSQL, material 테마를 사용한다. (Material theme을 좋아한다)

 

user table form

해당 사진은 user 테이블 구조를 시각적으로 나타낸 것이다. (HeidiSQL)

해당 테이블은 이런 이런 데이터를 저장한다를 보여주는 것이라고 생각해도 좋다.

해당 테이블에서 저장하는 값의 자료형, null 허용 여부, 기본값을 설정해 줄 수 있다.

 

해당 테이블을 relation schema로도 나타낼 수 있는다.

 

user(usercode, name, email, username, password, role, create_date, update_date)

 

user 테이블은 usercode, name, email, username, password, role, create_date, update_data를

저장한다는 뜻이다. 

 

아래의 사진을 통해 usercode, name, email, username, password, role, create_date, update_date가

테이블에서 어떤 역할을 하는지 직관적으로 볼 수 있다.

 

user table (relation)

해당 사진이 실제 user 테이블이다.

 

user 테이블은 usercode, name, email, username, password, role, create_date, update_date를 저장하는데

이는 저장되는 값들의 관계를 나타낸다.

 

이때 저장되는 값의 관계를 기준으로 데이터를 분류하여 집합으로 표현하고

하나의 관계에 대한 값의 집합을 domain이라고 한다.

또는 attribute라고도 한다.

 

둘 다 맞는 말이다. 틀릴 수도 있다.

domain과 attribute의 관계는 아래의 한 줄 로 설명할 수 있다.

 

값들의 집합은 domain이고 해당 domain의 역할 또는 목적은 attribute이다.

예를 들면 해당 사진에서 첫번째 domain에 대한 attribute는 usercode라는 것이다.

 

이제 왜 틀릴 수도 있는지 알아보겠다.

왜냐하면 하나의 domain이 여러 attribute로 나뉠 수도 있기 때문이다.

예를 들면 해당 사진에서 두번째 도메인은 first_name, last_name으로 나뉠 수도 있기 때문이다.

name이라는 같은 도메인내에서 firsr와 last로 나뉘는 것이다.

 

 

그럼 이제 또다른 todos 테이블에 대해 설명하겠다.

 

todos table form

todos 테이블은 각각의 task마다 todocode, usercode, toDo, state, importance, create_date, update_date를 저장한다.

 

해당 테이블에서 눈 여겨봐야 할 것은 todos 테이블에도 usercode를 저장한다는 것이다.

이처럼 중복된 필드가 테이블들의 연결고리가 된다. 자세한 설명은 조금 후에 하겠다.

 

todos table (relation)

todos 테이블이다.

각각의 task에는 task를 분류하는 todocode가 있다.

task는 하나의 테이블에 저장되기 때문에 단순히 task만 저장하면 구분하기 힘들다.

때문에 해당 task를 저장한 사용자의 usercode도 같이 저장한다.

 

user 테이블과 todos 테이블은 하나의 공통된 열 (usercode)를 갖고있다.

이러한 공통된 필드를 통해 user와 todos 두 테이블간의 관계를 생성할 수 있다.

관계라고해서 테이블간의 직접적인 데이터 교환이 아니다.

 

아래의 예제를 통해 설명하겠다.

select query

 

user 테이블에서 username이 jaean인 사용자의 usercode를 가져오고

user 테이블에서 가져온 usercode와 같은 usercode를 가지고 있는 todos를 가져오는 코드이다.

 

실행결과

 

이렇게 공통된 필드를 통해 한 테이블에서 또 다른 테이블로 접근이 가능한 (관계있는) 테이블들의 모임이

 

관계형 데이터베이스이다. 

 

 

마지막으로 테이블 만드는 법에 대해 알아볼 것이다.

 

HeidiSQL을 사용하면 위의 사진처럼 클릭으로 테이블을 만들 수 있지만 원래는 테이블 생성코드가 따로 있다.

 

먼저 user 테이블 먼저 알아보겠다.

 

CREATE TABLE `user` (
	`usercode` INT(11) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(50) NOT NULL COLLATE 'utf8mb3_general_ci',
	`email` VARCHAR(50) NOT NULL COLLATE 'utf8mb3_general_ci',
	`username` VARCHAR(50) NOT NULL COLLATE 'utf8mb3_general_ci',
	`password` VARCHAR(50) NOT NULL COLLATE 'utf8mb3_general_ci',
	`role` VARCHAR(50) NOT NULL COLLATE 'utf8mb3_general_ci',
	`create_date` DATETIME NOT NULL,
	`update_date` DATETIME NOT NULL,
	PRIMARY KEY (`usercode`) USING BTREE,
	UNIQUE INDEX `username` (`username`) USING BTREE
)
COLLATE='utf8mb3_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=30
;

 

user 테이블의 생성 코드이다. 간단하게 작성하면 아래와 같이 작성할 수 있다.

CREATE TABLE '테이블이름' (
    '필드1' 자료형 . . .
    '필드2' 자료형 . . .
    ...
);

 

그외의 디테일은 저장하는 값의 자료형, null 허용 여부, 기본값을 설정을 하는 것인데 이는

나중에 더 자세히 알아보겠다.

 

추가적으로 해당 코드에서 AUTO_INCREMENT=30은 무시해도된다.

해당 테이블의 auto_increment를 카운팅 상태를 나타내는데

 

새로운 user가 생성될 때마다 auto_increment가 1씩 올라가며 번호가 usercode의 값으로 저장된다.

 

 

그리고 todos 테이블의 생성 코드는 아래와 같다.

 

CREATE TABLE `todos` (
	`todocode` INT(11) NOT NULL AUTO_INCREMENT,
	`usercode` INT(11) NOT NULL COMMENT 'foreign key',
	`toDo` VARCHAR(50) NOT NULL COLLATE 'utf8mb3_general_ci',
	`state` VARCHAR(50) NOT NULL COLLATE 'utf8mb3_general_ci',
	`importance` INT(11) NOT NULL,
	`create_date` DATETIME NOT NULL,
	`update_date` DATETIME NOT NULL,
	PRIMARY KEY (`todocode`, `usercode`) USING BTREE,
	INDEX `todoCode` (`usercode`) USING BTREE,
	CONSTRAINT `todoCode` FOREIGN KEY (`usercode`) REFERENCES `login_practice`.`user` (`usercode`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
COLLATE='utf8mb3_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=112
;

 

 

 

테이블 생성문에서 부가요소들이 많은데 이는 나중에 자세하게 설명하겠다.