조인의 원리를 기반으로 조인 작업이 이루어집니다. 조인 알고리즘으로 중첩 루프 조인, 정렬 병합 조인, 해시 조인이 있습니다.

1. 중첩 루프 조인(NLJ, Nested Loop Join)

중첩 for 문과 같은 원리로 외부 테이블의 각 행에 대해 내부 테이블을 전체 스캔하며 조인 조건을 만족하는 행을 찾는 방법입니다. 데이터의 양이 적을 때는 효율적이지만 많을 경우엔 성능이 떨어집니다.

2. 정렬 병합 조인(Sort-Merge Join)

두 테이블을 조인할 키를 기준으로 정렬하고 조인 작업을 수행하는 방법입니다.

3. 해시 조인(Hash Join)

한 테이블을 해시 테이블로 만들고 다른 테이블을 해시 테이블에 조인하는 방법입니다.

해시 조인은 Build 단계와 Probe 단계로 진행됩니다.

 

1. Build 단계

한 테이블(일반적으로 작은 테이블)을 해시 테이블로 만드는 단계입니다. 조인에 사용되는 필드(attribute)가 해시 테이블의 키로 사용됩니다.

 

2. Probe 단계

다른 테이블(큰 쪽 테이블)을 읽어 해시 테이블을 탐색하면서 조인하는 과정입니다. 각 테이블을 한 번씩만 읽게 되어 중첩 루프 조인보다 보통은 성능이 좋습니다.

 

728x90

1. 조인이란?

두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는 연산입니다. 퍼즐 조각을 맞추듯이, 공통된 열을 기준으로 테이블을 합쳐서 원하는 정보를 얻을 수 있게 해줍니다.

관계형 데이터베이스인 MySQL에선 JOIN이란 쿼리로, 비관계형 데이터베이스인 MongoDB에선 lookup이라는 쿼리로 이를 처리할 수 있습니다.

 

2. 조인의 종류

join은 크게 inner join, outer join으로 나뉩니다. outer join에는 left (outer) join, right (outer) join, full (outer) join이 있습니다.

2-1. INNER JOIN

양쪽 테이블에서 모두 일치하는 값이 있는 행만 반환합니다.

 

<STUDENT>

ID NAME DEPT
1 홍길동 컴퓨터공학과
2 이순신 산업경영공학과
3 임꺽정 수학교육과

 

<ENROLLMENT>

STUDENT_ID COURSE_CODE GRADE
2 101 A+
3 102 B-
4 103 A0

 

SELECT STUDENT.NAME, ENROLLMENT.COURSE_CODE, ENROLLMENT.GRADE
FROM STUDENT
	INNER JOIN ENROLLMENT
    ON STUDENT.ID = ENROLLMENT.STUDENT_ID
STUDENT.NAME ENROLLMENT.COURSE_CODE ENROLLMENT.GRADE
이순신 101 A+
임꺽정 102 B-

 

2-2. LEFT (OUTER) JOIN

왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환합니다.

SELECT S.NAME, E.COURSE_CODE, E.GRADE
FROM STUDENT AS S
	LEFT JOIN ENROLLMENT AS E
    ON S.ID=E.STUDENT.ID
S.NAME E.COURSE_CODE E.GRADE
홍길동 NULL NULL
이순신 101 A+
임꺽정 102 B-

 

모든 학생 정보와 수강 신청을 했다면 과목코드, 점수를 보여줍니다. 수강신청을 하지 않은 학생의 경우 과목 코드와 점수는 NULL값으로 표시됩니다.

 

2-3. RIGHT (OUTER) JOIN

오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 반환합니다.

SELECT S.NAME, E.COURSE_CODE, E.GRADE
FROM STUDENT AS S
	RIGHT JOIN ENROLLMENT AS E
    ON S.ID=E.STUDENT.ID
S.NAME E.COURSE_CODE E.GRADE
이순신 101 A+
임꺽정 102 B-
NULL 103 A0

 

학생 정보가 없는 수강 신청의 경우 이름은 NULL 값으로 표시됩니다. 

 

2-3.  FULL (OUTER) JOIN

양쪽 테이블의 모든 행을 반환하고 일치하는 값이 없으면 NULL값으로 채웁니다.

SELECT S.NAME, E.COURSE_CODE, E.GRADE
FROM STUDENT AS S
	FULL JOIN ENROLLMENT AS E
    ON S.ID=E.STUDENT.ID
S.NAME E.COURSE_CODE E.GRADE
홍길동 NULL NULL
이순신 101 A+
임꺽정 102 B-
NULL 103 A0

 

728x90

데이터베이스는 데이터를 저장하고 관리하는 방식에 따라 크게 관계형 데이터베이스비관계형 데이터베이스로 나눌 수 있습니다.

 

1. 관계형 데이터베이스 (Relational Database Managment System, RDBMS)

관계형 데이터베이스는 데이터를 테이블 형식으로 저장하고, 테이블 간의 관계를 이용하여 데이터를 관리합니다.

SQL(Structured Query Language)을 사용하여 데이터를 조작합니다.

  • 종류
    MySQL, PostgreSQL, Oracle, SQL Server, MSSQL 등

MySQL

오픈 소스이며, 웹 기반 애플리케이션에 매우 인기가 높습니다. 간단하면서도 효율적인 처리를 제공합니다.

 

Microsoft SQL Server

엔터프라이즈 수준의 관리 기능과 보안 기능을 제공합니다.

 

Oracle Database

기업 환경에서 널리 사용되는 강력한 데이터베이스 시스템. 고가용성, 보안, 확장성이 탁월합니다.

 

PostgreSQL

오픈 소스이고, 표준 SQL을 지원하는 동시에 객체 관계형 기능도 제공합니다. 확장성이 뛰어납니다.

2. 비관계형 데이터베이스 (NoSQL, Not only SQL)

NoSQL(Not only SQL)이라는 슬로건에서 생겨난 데이터베이스입니다. SQL을 사용하지 않는 데이터베이스를 말합니다.

  • 종류
    MongoDB, redis

MongoDB

문서 지향적(Document-Oriented) 데이터베이스로, JSON과 유사한 형태로 데이터를 저장합니다. 스키마가 유연하여 개발이 빠르고 간편합니다.

 

Redis

키-값 저장소로, 데이터를 메모리에 저장하여 빠른 접근을 가능하게 합니다. 캐싱, 메시징 큐, 실시간 애플리케이션 등에 사용됩니다.

728x90

1. 트랜잭션(Transaction)이란?

트랜잭션DBMS에서 데이터의 일관성을 보장하기 위해 사용되는 논리적인 작업의 단위입니다. 쉽게 말해, 데이터베이스에서 하나의 작업을 수행하기 위한 여러 동작들을 하나로 묶은 것을 의미합니다.

 

예를 들어, 은행에서 돈을 이체한다고 하면

1. A계좌에서 돈을 출금한다.

2. 출금한 돈을 B계좌에 입금한다.

이 두 가지 동작은 따로따로 실행되면 안됩니다. 1번만 실행되고 2번이 실행되면 돈을 다 잃게 되기 때문입니다. 트랜잭션은 이 두 동작을 하나로 묶어서 둘 다 실행되거나, 둘 다 실행되지 않도록 보장합니다.

 

2. 트랜잭션의 특징(ACID)

트랜잭션은 ACID(원자성, 일관성, 독립성, 지속성)라는 특징을 갖고 있습니다.

 

2-1. 원자성 Atomicity

'All or Nothing'

 

트랜잭션은 'All or Nothing'이라는 원칙을 따릅니다. 즉, 트랜잭션의 모든 연산이 수행되거나 전혀 수행되지 않아야 합니다.

앞선 예시처럼 은행에서 계좌 이체 트랜잭션이 수행되는 경우, 출금과 입금이 모두 성공하거나 모두 실패해야 합니다.

 

commit

트랜잭션을 완료하고 변경 사항을 데이터베이스에 영구적으로 반영했다는 명령어입니다. 여러 쿼리(update, insert, delete)가 성공적으로 처리되었다고 확정했다는 뜻입니다.

'커밋이 수행되었다.' = '하나의 트랜잭션이 성공적으로 수행되었다.'

 

https://velog.io/@luvjoyyy/JUST-DO-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-6-COMMIT-ROLLBACK-PK

 

 

rollback

트랜잭션을 취소하고 변경 사항을 이전 상태로 되돌렸다는 명령어입니다. 에러나 여러 이슈 때문에 트랜잭션 전으로 돌려야 하는 상황에서 사용됩니다.

https://velog.io/@luvjoyyy/JUST-DO-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-6-COMMIT-ROLLBACK-PK

 

commit과 rollback으로 데이터의 무결성이 보장됩니다. 또한, 데이터 변경 전에 변경 사항을 쉽게 확인할 수 있고 해당 작업을 그룹화할 수 있습니다.

 

2-2. 일관성 Consistency

일관성허용된 방식으로만 데이터를 변경해야 하는 것을 의미합니다. 트랜잭션이 시작되기 전과 후에 데이터베이스는 항상 일관된 상태여야 합니다. 트랜잭션이 완료된 후에도 데이터베이스는 미리 정의된 규칙, 제약 조건, 무결정 조건을 준수해야 합니다.

계좌 잔액은 항상 0 이상이어야 한다는 규칙이 있다고 가정해봅시다.(마이너스 통장 안됨)

A에게 100만원, B에게 0원이 있다고 할 때, A가 B에게 입금할 수 있는 금액은 100만원이 넘어가선 안됩니다.

 

2-3. 격리성 Isolation

여러 트랜잭션이 동시에 실행되는 경우, 서로에게 영향을 주지 않도록 격리되어야 합니다. 격리성은 트랜잭션 수행 시 서로 끼어들지 못하는 것을 말합니다.

예를 들어, A가 계좌에서 돈을 출금하는 동시에 B가 같은 계좌에 입금하는 경우, 두 트랜잭션은 서로의 작업을 간섭하지 않고 독립적으로 실행되어야 합니다.

여러 개의 격리 수준으로 나뉘어 격리성을 보장합니다.

 

https://velog.io/@yu-jin-song/DB-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80Transaction-Isolation-Level

격리 수준에 따라 발생하는 현상으로 팬텀 리드, 반복 가능하지 않은 조회, 더티 리드가 있습니다.

 

1. Phantom Read(팬텀 리드)

한 트랜잭션 내에서 동일한 쿼리를 두 번 실행했을 때, 그 사이에 다른 트랜잭션이 데이터를 삽입하거나 삭제하여 결과 집합이 달라지는 현상입니다.

예)

1. 트랜잭션 A가 잔액 100만원 이상인 계좌 조회(결과: 3) (100 100 100)

2. 트랜잭션 B가 잔액 150만원 이상인 새로운 계좌 생성하고 커밋(데이터 삽입) (100 100 100 150)

3. 트랜잭션 A가 잔액 100만원 이상인 계좌 조회(결과: 4)

 

2. Non-Repeatable Read(반복 가능하지 않은 조회)

동일한 트랜잭션 내에서 같은 데이터(행)를 두 번 이상 조회했는데 그 사이에 다른 트랙잭션이 데이터를 변경하여 읽은 값이 달라지는 현상입니다.

ex)

1. 트랜잭션 T1이 계좌 잔액 100만 원을 읽음(결과: 100만 원)

2. 트랜잭션 T2가 해당 계좌에서 10만 원을 출금하고 커밋

3. 트랜잭션 T1이 다시 계좌 잔액을 읽음(결과: 90만 원)

팬텀 리드와 다른 점은 팬텀 리드는 다른 행이 선택될 수 있다는 것이고 반복 가능하지 않은 조회는 행 값이 달라질 수 있는 것입니다.

 

3. Dirty Read(더티 리드)

한 트랜잭션이 다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽는 현상입니다.

ex)

1. 트랜잭션 T1이 계좌 잔액을 100만 원에서 90만 원으로 변경(아직 커밋되지 않음)

2. 트랜잭션 T2가 해당 계좌 잔액을 조회하면 90만 원으로 읽음

3. 트랜잭션 T1이 변경 상황을 롤백하여 잔액을 다시 100만 원으로 되돌림

4. 트랜잭션 T2는 잘못된 정보(90만 원)를 읽어온 것이 됨

 

트랜잭션 격리 수준에 따라 SERIALIZABLE, REPEATABLE_READ, READ_COMMITTED, READ_UNCOMMITTED로 나눌 수 있습니다.

1. SERIALIZABLE

가장 높은 수준의 격리로 트랜잭션을 순차적으로 진행시키는 것을 말합니다.

- 장점: Dirty Read, Non-Repeatable Read, Phantom Read를 모두 방지합니다.

- 단점: 교착 상태가 일어날 확률도 많고 가장 성능이 떨어지는 격리 수준입니다.

 

2. REPEATABLE_READ

트랜잭션이 시작된 후 읽은 데이터는 다른 트랜잭션이 변경할 수 없습니다. 트랜잭션 중에 같은 데이터를 여러 번 읽어도 항상 같은 값을 얻습니다. 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을 추가하는 것은 막지 않습니다. 

- 장점: Dirty Read, Non-Repeatable Read는 방지합니다.

- 단점: 새로운 데이터 삽입/삭제로 인해 Phantom Read가 발생할 수 있습니다.

 

3. READ_COMMITTED

트랜잭션이 커밋된 데이터만 읽을 수 있습니다. 다른 트랜잭션이 커밋하지 않은 변경 사항은 보이지 않습니다.

가장 많이 사용되는 격리 수준이며 PostgreSQL, SQL Server, Oracle에서 기본값으로 설정되어 있습니다.

- 장점: 커밋되지 않은 데이터는 읽을 수 없으므로 Dirty Read는 방지합니다.

- 단점: 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있습니다. 따라서 트랜잭션이 같은 행을 다시 읽을 때 다른 내용이 반환될 수 있습니다. 따라서, Non-Repeatable Read, Phantom Read가 발생할 수 있습니다.

 

4. READ_UNCOMMITTED

가장 낮은 격리 수준이며 다른 트랜잭션에서 커밋되지 않은 데이터도 읽을 수 있습니다.

- 장점: 가장 빠릅니다.

- 단점: 데이터의 신뢰성이 떨어집니다.

격리 수준 Dirty Read Non-Repeatable Read Phantom Read 성능
SERIALIZABLE 불가능 불가능 불가능 낮음
REPEATABLE_READ 불가능 불가능 가능 중간
READ_COMMITTED 불가능 가능 가능 중간
READ_UNCOMMITTED 가능 가능 가능 높음

 

2-4. 지속성 Durability

트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 데이터베이스에 반영되어야 하는 것을 의미합니다. 시스템 장애가 발생하더라도 트랜잭션의 결과는 유지되어야 합니다. 지속성을 보장하기 위해 체크섬, 저널링, 롤백 등의 기능을 사용합니다.

체크섬(Checksum)

: 데이터의 무결성을 확인하기 위한 간단한 방법입니다. 데이터의 내용을 기반으로 생성된 작은 숫자 값(체크섬)을 사용하여 데이터가 손상되거나 변조되지 않았는지 확인합니다.

- 작동방식

1. 데이터가 저장될 때, 데이터의 내용을 기반으로 체크섬 값이 계산되어 함께 저장됩니다.

2. 데이터가 읽힐 때, 다시 체크섬을 계산하여 저장된 체크섬 값과 비교합니다. 두 값이 일치하면 데이터가 무결하다고 판단합니다. 일치하지 않으면 데이터가 손상되었음을 뜻합니다.

저널링(Journaling)

트랜잭션의 변경 사항을 데이터베이스에 반영하기 전에 별도의 저널(로그) 파일에 기록하는 기법으로 시스템 장애 시 데이터베이스를 복구할 수 있게 합니다.

 

3. 무결성 Integrity

무결성데이터의 정확성, 일관성, 유효성을 유지하는 것을 의미합니다. 데이터베이스는 현실 세계를 반영해야 하므로 데이터베이스 내 데이터는 현실 세계의 규칙과 제약 조건을 준수해야 합니다. 이러한 규칙과 제약 조건을 데이터베이스에 적용하는 것을 무결성 제약 조건이라고 합니다.

정확성: 데이터베이스에 저장된 데이터가 현실 세계와 일치해야 합니다. 데이터는 오류나 누락 없이 정확하게 입력되고 유지되어야 합니다.

ex) 상품의 가격 정보가 잘못 입력되면 안됨

일관성: 데이터베이스 내의 데이터는 모순 없이 일관되게 유지되어야 합니다. 같은 정보를 나타내는 데이터는 모든 테이블에서 동일한 값을 가져야 합니다.

유효성: 데이터베이스에 저장된 데이터는 정해진 규칙이나 제약 조건을 만족해야 합니다.

ex) 숫자 형식의 필드에는 숫자값만 입력되어야 하고 필수 입력 필드에는 NULL 값이 허용되지 않아야 함

 

무결성은 개체 무결성, 참조 무결성, 고유 무결성, NULL 무결성 등이 있습니다.

1. 개체 무결성 (Entity Integrity)

: 기본키로 선택된 필드는 빈 값을 허용하지 않습니다.

 

2. 참조 무결성 (Referential Integrity)

: 외래키(foreign key)는 참조하는 테이블의 기본키 값과 일치하거나 NULL값을 가져야 합니다. 참조되는 테이블의 데이터가 없을 수도 있기 때문에 NULL값을 가질 수 있습니다.

 

3. 고유 무결성 (Unique Integrity)

: 특정 컬럼 또는 컬럼 조합에 중복된 값이 없어야 합니다. 기본키는 고유 무결성을 만족해야 합니다. 예를 들어 주민등록번호, 운전면허증 번호, 이메일 주소 등은 테이블 내에서 고유해야 합니다.

 

4. NULL 무결성 (NULL Integrity)

: 특정 컬럼에 대해 NULL 값이 허용되지 않도록 보장하는 것을 의미합니다.

728x90

1. ERD란?

ERD(Entity Relationship Diagram)는 데이터베이스의 구조를 시각적으로 표현하는 다이어그램입니다.

데이터베이스를 구축할 때 가장 기초적인 뼈대 역할을 하며, Relation 간의 관계들을 정의한 것입니다.

 

ERD는 시스템 요구 상황을 기반으로 작성되며 이 ERD를 기반으로 데이터베이스를 구축합니다.

 

https://velog.io/@kjhxxxx/DataBase-ERD%EB%9E%80

ERD는 Entity, Attribute, Relationship으로 이루어져 있습니다.

ERD를 작성할 때, 요구 사항을 분석하고 entity와 attribute를 정의하고 각 entity 간의 관계를 정의해야 합니다. 또한, 데이터 중복을 최소화하기 위해 정규화를 고려해야 합니다.

2. 정규화

정규화는 데이터 중복을 최소화하고 데이터의 일관성을 유지하기 위한 거치는 과정입니다. 릴레이션 간의 잘못된 종속 관계로 발생되는 문제를 해결하고, 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정입니다.

정규화는 여러 단계로 구성되며, 각 단계는 특정 규칙을 만족해야 합니다.

정규화된 정도에 따라 제1 정규형(NF, Normal Form), 제2 정규형, 제3 정규형, 보이스/코드 정규형, 제4 정규형, 제5 정규형이 있습니다.

2-1. 제1 정규형(1NF)

테이블의 모든 속성은 원자값(더 이상 분해할 수 없는 값)을 가져야 합니다.

StudentID Name Course
1 홍길동 {물리, 화학}
2 이순신 {수학, 영어}

 

속성 값 중에서 한 개의 기본키에 대해 두 개 이상의 값을 가지는 반복 집합이 있습니다. 홍길동의 Course가 {물리, 화학}인데 이것을 제1 정규형에 따르면 이것을 나눠야 합니다.

StudentID Name Course
1 홍길동 물리
1 홍길동 화학
2 이순신 수학
2 이순신 영어

 

2-2. 제2 정규형(2NF)

제1 정규형을 만족하면서 기본 키가 아닌 속성은 기본 키에 종속되어야 합니다.(부분 종속성 제거) 쉽게 말해, 현재 테이블의 주제와 관련없는 속성을 다른 테이블로 빼는 작업입니다.

OrderID(주문번호) CustomerID(고객ID) Product(상품명) Category(카테고리) Price(가격)
1 A 도서 15,000원
2 A 티셔츠 의류 25,000원
3 B 컴퓨터 마우스 전자제품 10,000원

 

이 테이블의 기본 키는 주문번호 및 고객ID입니다.

제 2정규형을 적용하기 위해선 기본 키에 완전히 종속되지 않은 속성을 찾아야 합니다. 기본 키가 아닌 키에 종속이 되는 키를 찾는다는 의미와 같습니다. Product, Category, Price는 기본 키인 {OrderID, CustomerID}에 완전히 종속되지 않습니다. 따라서 테이블을 아래와 같이 분리합니다.

 

<주문 테이블>

OrderID CustomerID Product
1 A
2 A 티셔츠
3 B 컴퓨터 마우스

 

<상품 테이블>

Product Category Price
도서 15,000원
티셔츠 의류 25,000원
컴퓨터 마우스 전자제품 10,000원

 

2-3. 제3 정규형(3NF)

제2 정규형을 만족하면서 이행적 함수 종속성(transitive FD)이 없어야 합니다.

이행적 함수 종속이란 A->B, B->C 관계에서 A->C 관계가 성립하는데 이 때, C가 집합 A에 이행적으로 함수 종속이 되었다고 합니다.

다시 말해, 기본 키가 아닌 속성이 다른 키(기본키 제외)에 종속되면 안됩니다.

위 예시에서 이행적 종속 관계를 확인해봅시다.

카테고리 내 상품들은 가격이 같다고 가정하면 상품 테이블에서 Product -> Category, Category -> Price 관계가 있으므로 이행적 종속인 Product -> Price 관계가 성립합니다. 따라서 상품 테이블을 아래와 같이 분리할 수 있습니다.

 

<상품 테이블>

Product Category
도서
티셔츠 의류
컴퓨터 마우스 전자제품

 

<카테고리 테이블>

Category Price
도서 15,000원
의류 25,000원
전자제품 10,000원

 

2-4. 보이스/코드 정규형(Boyce-Codd Normal Form, BCNF)

보이스/코드 정규형은 제 3정규형을 만족하면서 모든 결정자가 후보키여야 합니다.

 

결정자란 다른 속성의 값을 고유하게 결정하는 속성(또는 속성들의 집합)입니다.
간단히 말해, 결정자는 다른 속성에 대한 정보를 제공합니다.
학번(StudentID) 이름(Name) 전공(Major)
1 홍길동 경영학
2 이순신 컴퓨터공학
3 김유신 기계공학

이 테이블에서 학번 이름 전공을 결정합니다. 다시 말해, 학번을 알고 있다면 해당 학생 이름과 전공을 알 수 있습니다. 따라서 이 테이블의 결정자는 학번입니다. 함수 종속성으로 표현하면 학번 -> 이름, 학번 -> 전공 관계가 성립합니다.

 

<프로젝트 할당 테이블>

직원ID 프로젝트ID 역할 프로젝트매니저
1 100 개발자 김매니저
2 101 디자이너 박매니저
3 100 테스트 김매니저
4 102 개발자 이매니저

여기서 기본 키는 (직원ID, 프로젝트ID)입니다. 이 테이블은 제 3정규형을 만족합니다. 모든 비기본 키 속성(역할, 프로젝트매니저)이 기본 키 전체에 종속되기 때문입니다.

이 테이블을 보면 다음과 같은 함수 종속성이 있습니다.

1. (직원ID, 프로젝트ID) -> 역할, 프로젝트매니저

2. 프로젝트ID -> 프로젝트매니저

위의 두 번째 종속성을 보면 프로젝트ID 프로젝트매니저를 결정하고 있습니다. 하지만 프로젝트ID는 후보 키가 아닙니다.(기본 키 조합에 포함되어 있는 것이지 그 자체로 후보 키가 아님)

BCNF를 만족시키기 위해 테이블을 분리합니다.

 

<프로젝트 할당 테이블>

직원ID 프로젝트ID 역할
1 100 개발자
2 101 디자이너
3 100 테스트
4 102 개발자

 

<프로젝트 테이블>

프로젝트ID 프로젝트매니저
100 김매니저
101 박매니저
102 이매니저

 

이렇게 분리하면 모든 결정자(프로젝트 할당 테이블 - (직원ID, 프로젝트ID) / 프로젝트 테이블 - 프로젝트ID)가 후보 키가 되어 BCNF를 만족하게 됩니다.

 

정규형 과정을 거친다고 해도 성능이 무조건 좋아지는 것은 아닙니다. 경우에 따라 정규화 또는 비정규화 과정을 진행해야 합니다.

728x90

'DB' 카테고리의 다른 글

[데이터베이스] 조인의 원리  (0) 2024.05.29
[데이터베이스] 조인 JOIN  (0) 2024.05.28
[데이터베이스] 종류  (0) 2024.05.21
[데이터베이스] 트랜잭션 Transaction  (0) 2024.05.21
[데이터베이스] 데이터베이스 개념  (0) 2024.05.15

1. 데이터베이스 개념

데이터베이스(DB, DataBase)는 일정한 규칙, 혹은 규약을 통해 구조화되어 저장되는 데이터의 모음

DBMS(Database Management System): 데이터베이스를 관리하는 소프트웨어

- 종류: MySQL, Oracle, Microsoft SQL Server, PostgreSQL

데이터베이스 안에 있는 데이터들은 특정 DBMS마다 정의된 쿼리 언어(query language)를 통해 삽입, 삭제, 수정, 조회 등을 수행할 수 있습니다. 또한, 데이터베이스는 실시간 접근과 동시 공유가 가능합니다.

출처: https://www.techopedia.com/kr/definition/database-management-systems-dbms

위 그림과 같은 구조를 기반으로 데이터를 주고 받습니다.

Ex) MySQL(DBMS)가 있고 그 위에 응용 프로그램에 속하는 Node.js나 php에서 해당 데이터베이스 안에 있는 데이터를 그집어내 해당 데이터 관련 로직을 구축할 수 있습니다.

2. 엔터티(Entity)

엔터티는 현실 세계에서 독립적으로 존재하며 고유하게 식별 가능한 객체나 개체를 의미합니다. 예를 들어, 학생, 책, 주문 등이 엔터티가 될 수 있습니다.

  • 강한 Entity: 고유하게 식별할 수 있는 기본 키를 갖고 있으며 독립적으로 존재할 수 있는 entity
    Ex) 학생 entity는 학번을 기본 키로 가지며 다른 entity에 의존하지 않고 독립적으로 존재할 수 있습니다.
  • 약한 Entity:  고유하게 식별할 수 있는 기본 키(Primary key)가 없고 다른 entity에 의존하여 식별하는 entity
    Ex1) 주문 항목 entity는 주문 entity에 의존하여 식별됩니다. 주문번호와 항목번호를 합쳐서 고유하게 식별될 수 있습니다.
    Ex2) 직원의 자녀 entity는 직원 entity에 의존하여 식별됩니다. 직원ID와 자녀의 이름을 합쳐서 고유하게 식별될 수 있습니다.

2. 속성(Attribute)

엔터티는 속성(Attribute)를 가집니다. 속성 Entity의 특성이나 성질을 나타냅니다.

Ex) 학생이라는 Entity가 있을 때, 이름, 학번, 생년월일, 전공 등을 속성으로 가질 수 있습니다.

3. 도메인(Domain)

Domain은 속성이 가질 수 있는 값의 집합을 의미합니다.

Ex) 성별 속성이 있을 때, 이 속성이 가질 수 있는 값은 {남, 여} 집합이 됩니다.

4. 릴레이션(Relation)

Relation은 데이터베이스에서 정보를 구분하여 저장하는 기본 단위입니다. 쉽게 말해, 데이터를 표 형태로 표현한 것입니다. Entity에 관한 데이터를 데이터베이스는 relation 하나에 담아서 관리합니다.

Ex) 학생이라는 entity가 데이터베이스에서 관리할 때 아래와 같이 relation(표 형태)로 관리됩니다.

학번 이름 나이 전공
1 홍길동 20 컴퓨터공학과
2 임꺽정 21 산업경영공학과

관계형 데이터베이스에서는 'table', NoSQL 데이터베이스에서는 'collection'이라고 합니다.

  • 관계형 데이터베이스: 데이터를 테이블 형태로 저장하고 관리
    - 구조: record-table-database
  • NoSQL 데이터베이스: 비관계형 데이터베이스
    - 구조: document-collection-database

https://code.tutsplus.com/relational-databases-for-dummies--net-30244t

위 그림과 같이 record가 쌓여서 table이 되고 table이 쌓여서 database가 됩니다.

5. Field & Record

6. Field Type

필드는 타입을 갖습니다.

Ex) 이름 -> 문자열, 전화번호 -> 숫자

 

숫자 타입

타입 용량(byte) 최솟값(부호O) 최댓값(부호O) 최솟값(부호X) 최댓값(부호X)
TINYINT 1(=8bit) -128 127 0 255
SMALLINT 2 -32768 32767 0 65535
MEDIUMINT 3 -8388608 8388607 0 16777215
INT 4 -2147483648 2147483647 0 4294967295
BIGINT 8 -263 263-1 0 264-1

부호가 있는 정수: 양수 또는 음수

부호가 없는 정수: 0 또는 양수

 

날짜 타입

타입 용량(byte) 지원 범위
DATE 3 1000-01-01 ~ 9999-12-31
DATETIME 8 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
TIMESTAMP 4 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07

 

문자 타입

타입 특징 길이
CHAR 고정 길이 문자열(짧든 길든 선언한 길이 값으로 고정해서 저장) 0 ~ 255
VARCHAR 가변 길이 문자열(입력된 데이터에 따라 용량을 가변시켜 저장) 0 ~ 6535
TEXT 큰 문자열 저장(ex. 게시판의 본문 저장)  
BLOB 이미지, 동영상 등 큰 데이터 저장  
ENUM 미리 정의된 값 중 하나만 저장 가능 최대 65535개 요소 넣을 수 있음
SET 미리 정의된 값 중 여러 개 저장 가능 최대 64개 요소 넣을 수 있음

 

7. Relationship(관계)

데이터베이스에 있는 여러 개의 테이블은 서로 관계가 정의되어 있습니다. 관계를 화살표로 표현하는데 이를 관계화살표라고 합니다.

하나의 A는 하나의 B로 구성되어 있다.
하나의 A는 하나 이상의 B로 구성되어 있다.
하나의 A는 하나 이하의 B로 구성되어 있다.
하나의 A는 0 또는 하나 이상의 B로 구성되어 있다.

 

1:1 관계

유저 - 유저 이메일

 

1:N 관계

유저(1)-장바구니 내 상품(N)

 

N:M 관계

학생(N)-강의(M)

 

8. 키(Key)

<학생 테이블>

학번 이름 주민등록번호 학과 강의
2019000000 A 1234 컴퓨터공학과 웹프로그래밍
2019100001 B 1523 컴퓨터공학과 네트워크 기초
2019200002 C 4567 컴퓨터공학과 운영체제
2019300003 D 2647 컴퓨터공학과 웹프로그래밍
2019400004 E 1756 산업경영공학과 운영체제
2019500005 F 9842 산업경영공학과 웹프로그래밍
2019600006 G 3695 산업경영공학과 기술경영

 

<강의 테이블>

강의명 교수 교수ID
웹프로그래밍 김OO 1
네트워크 기초 박OO 2
운영체제 이OO 3
기술경영 김OO 1

 

기본키(Primary Key, PK)

: 유일성과 최소성을 가지며 각 행(record)을 유일하게 식별할 수 있는 칼럼(또는 칼럼 조합)

- 중복된 값을 가질 수 없습니다.

- NULL값을 허용하지 않습니다.

- 유일성: 어떤 키의 값이 데이터베이스 내의 모든 행에 대해 유일해야 한다는 원칙

- 최소성: 키를 구성하는 데 필요한 속성의 수를 최소화해야 한다는 원칙

Ex) 학생 테이블 -> 학번 or 주민등록번호 / 강의 테이블 -> 강의명

 

자연키 : 테이블의 데이터가 자연스럽게 가지고 있는 키를 이용해 만들어진 키(데이터 자체에서 파생되는 키)

Ex) 학생 테이블 -> 학번, 주민등록번호 / 강의 테이블 -> 강의명

 

인조키: 인위적으로 생성한 키

Ex) 강의 테이블 -> 강의ID를 부여하는 경우, 강의ID가 인조키

 

외래키(Foreign Key, FK)

: 다른 테이블의 기본키를 참조하는 값

- 두 테이블 간의 관계를 설정하는데 사용

Ex) 학생 테이블(강의) - 강의 테이블(강의명) -> '학생 테이블'의 '강의'는 외래키이며 '강의 테이블'의 기본키를 참조

 

후보키(Candidate Key)

: 테이블에서 기본키로 사용될 수 있는 후보가 되는 키

- 유일성과 최소성을 동시에 만족합니다.

Ex) 학생 테이블 - 학번, 주민등록번호

 

대체키(Alternate Key)

: 기본키로 사용될 수 있지만 실제로는 사용되지 않는 키(후보키 - 기본키)

Ex) 학생 테이블 - 기본키로 학번을 사용하면 주민등록번호는 대체키

 

슈퍼키(Super Key)

: 테이블 내에서 각 행을 유일하게 식별할 수 있는 하나 또는 하나 이상의 칼럼의 조합

- 유일성만 만족하면 됩니다.

- 최소성은 보장하지 않을 수 있습니다.

Ex) 학생 테이블 - {학번, 주민등록번호}

728x90

+ Recent posts