관계 (Relationship)
관계형 데이터베이스에서 "관계"는 테이블 간의 연결을 의미합니다. 두 개의 엔티티 사이의 논리적인 연결, 엔티티와 엔티티가 존재의 형태나 행위로서 서로에게 영향을 주는 형태를 관계라고 합니다.
부모의 식별자를 자식의 식별자에 포함하면 식별관계, 부모의 식별자를 자식의 일반속성으로 상속하면 비식별관계라고 할 수 있습니다. 이러한 관계는 데이터의 무결성과 조직을 유지하는 데 중요합니다. 주요 관계 유형에는 다음과 같습니다.
조인 (Join)
조인은 두 개 이상의 테이블을 연결하여 데이터를 검색하는 데 사용되는 방법입니다. 조인을 사용하면 여러 테이블에 흩어져 있는 정보를 결합하여 의미 있는 방식으로 조회할 수 있습니다. 주요 조인 유형은 다음과 같습니다.
내부 조인 (Inner Join): 두 테이블의 교집합을 반환합니다. 두 테이블 모두에서 일치하는 레코드만 결과에 포함됩니다.
외부 조인 (Outer Join)

위 모델은 고객과 주문 엔터티가 관계를 맺고 있습니다. 고객 엔티티의 입장에서는 ‘한 명의 고객은 여러 번 주문할 수 있다’, 주문 엔티티 입장에서는 ‘각각의 주문은 반드시 한 명의 고객에 의해 발생됩니다.
관계를 맺음으로 생기는 현상은 고객 엔티티의 식별자인 고객번호를 주문 엔티티에 상속시킨 것. 즉, 관계를 맺는다는 것은 식별자를 상속시키고 해당 식별자를 매핑키로 활용해 데이터를 결합하여 보겠다는 것!
계층형 데이터 모델이 무엇인지만 알고 넘어갑시다.
계층형 데이터 모델은 데이터를 트리 구조로 표현하는 방식으로 동일한 데이터에서 상하 구조가 있는 것을 말합니다. 이 모델은 데이터를 계층적으로 구조화하여 관리하며, 각 계층은 다른 계층과 부모-자식 관계를 갖습니다. 즉, 계층형 데이터 모델에서는 한 레코드가 자기 자신에 대한 관계를 가질 수 있습니다. 이러한 경우를 “순환관계" 또는 "자기 참조관계"라고 합니다.
예를 들어, 조직도에서 각각의 직원은 부서 내에서 일하는 동료들과 관계가 있을 뿐만 아니라, 상사와 같은 상위 부서의 직원과도 관계가 있을 수 있습니다. 이때, 각 직원은 자기 자신과도 연결될 수 있습니다. 이러한 구조를 사용하면 조직 내에서 각 직원이 어떤 부서에 속해 있고, 누가 그들의 상사인지 등을 표현하기 용이해집니다.
계층형 데이터 모델의 다른 점은 자기 자신을 조인했다는 것입니다. 이를 우리는 셀프조인(Self-Join)이라고 합니다.

상호배타적 관계가 무엇인지만 이해하고 넘어갑시다.
상호 배타적 관계(Exclusive Relationship)란 두 요소 또는 그룹 간의 관계 중에서 서로 중복되지 않고 상호 배타적인 경우를 의미합니다. 즉, 한 요소 또는 그룹이 다른 요소 또는 그룹과 동시에 속할 수 없는 관계를 나타냅니다. 이러한 관계는 두 가지 이상의 상태 또는 조건 중 하나만이 성립할 수 있도록 설계되어 있습니다.
친구 A와 B가 같은 레스토랑에서 저녁을 함께 주문하려고 합니다. 그런데 A는 피자를 먹고 싶고, B는 파스타를 먹고 싶어합니다. 레스토랑의 규칙에 따르면 한 사람당 하나의 메뉴만 주문할 수 있습니다. 따라서 A가 피자를 주문하면 B는 파스타를 선택할 수 없고, 그 반대도 마찬가지입니다. 이때 피자와 파스타는 상호배타적인 관계에 있습니다.
다시 말해, A가 피자를 주문하면 B는 그 메뉴를 선택할 수 없으며, B가 파스타를 주문하면 A는 피자를 선택할 수 없습니다. 이렇게 둘 중 하나를 선택하는 것이 상호배타적인 관계의 특징입니다.
| Q. 문제 | 다음 중 SQL에서 두 테이블을 결합하는 데 사용되는 조인 유형으로 가장 부적절한 것은 무엇인가? |
|---|---|
| A | 내부 조인 (INNER JOIN) |
| B | 외부 조인 (OUTER JOIN) |
| C | 교차 조인 (CROSS JOIN) |
| D | 순차 조인 (SEQUENTIAL JOIN) |
정답
내부 조인 (INNER JOIN)은 두 테이블에서 일치하는 행을 결합할 때 사용됩니다. 외부 조인 (OUTER JOIN)은 일치하는 행이 없는 경우에도 한 테이블의 행을 포함하여 결합할 때 사용되며, 외부 조인에는 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있습니다. 교차 조인 (CROSS JOIN)은 두 테이블 간의 모든 가능한 조합을 생성합니다.
| Q. 문제 | 다음 중 데이터베이스에서 엔티티 간의 관계를 매핑하고 데이터를 연결하는 방식에 대한 설명으로 가장 정확한 것은 무엇인가? |
|---|---|
| A | A) 조인은 데이터베이스 내의 두 엔티티 간에 논리적 연결을 생성하지 않고, 데이터를 단일 엔티티로만 관리한다. |
| B | B) 조인은 주로 데이터베이스 내의 테이블을 별도로 분리하여 관리하기 위해 사용되며, 엔티티 간의 관계를 매핑하는 데 사용되지 않는다. |
| C | C) 조인은 엔티티 간의 관계를 매핑하기 위해 매핑키를 사용하여 두 엔티티의 데이터를 연결하고, 관련된 정보를 함께 조회할 수 있게 한다. |
| D | D) 조인은 오직 데이터베이스의 성능 최적화를 위해서만 사용되며, 엔티티 간의 관계나 데이터 연결에는 영향을 미치지 않는다 |
정답
조인은 데이터베이스에서 두 테이블(엔티티) 간의 관계를 매핑하고 데이터를 연결하는 중요한 기능입니다. 매핑키(보통 외래키)를 통해 관련된 엔티티의 데이터를 함께 조회할 수 있으며, 이를 통해 복잡한 데이터 관계를 효과적으로 처리할 수 있습니다. 선택지 A, B, D는 조인의 정의와 역할을 잘못 설명하고 있습니다.
트랜잭션은 데이터베이스의 논리적 연산단위입니다.
트랜잭션 예시: 은행 계좌 이체
가상의 은행에서 두 계좌 간의 금액 이체를 통해 트랜잭션을 설명해 보겠습니다
1. 시작 (Begin):
2. 작업 수행:
3. 확인 (Commit):
4. 롤백 (Rollback):
5. 끝 (End):
데이터 모델링에서 트랜잭션은 몇 가지 특징을 갖고 있습니다. 주요 특징은 다음과 같습니다:
1. 원자성 (Atomicity):
- 트랜잭션은 원자적인 작업의 단위로 간주됩니다. 이는 트랜잭션 내에서 수행되는 모든 작업이 성공하거나 실패할 경우 전체가 실패하는 것을 의미합니다. 중간에 어떠한 작업이라도 실패하면 이전 상태로 롤백되어야 합니다.
2. 일관성 (Consistency):
- 트랜잭션이 완료된 후에는 데이터베이스가 일관된 상태여야 합니다. 트랜잭션이 시작하기 전과 후에 일관성이 유지되어야 합니다. 데이터베이스의 제약조건을 준수하고, 비즈니스 규칙을 지켜 일관성을 유지합니다.
3. 고립성 (Isolation):
- 여러 트랜잭션이 동시에 실행될 때 각각의 트랜잭션이 서로 영향을 미치지 않도록 하는 것을 의미합니다. 다수의 트랜잭션이 동시에 실행될 때, 각각의 트랜잭션이 자신만의 공간에서 작업하고 마치 다른 트랜잭션이 존재하지 않는 것처럼 격리되어야 합니다.
4. 지속성 (Durability):
- 트랜잭션이 성공적으로 완료된 경우, 해당 트랜잭션에서 수행한 변경 사항은 영구적으로 데이터베이스에 반영되어야 합니다. 시스템 장애 또는 다시 시작되더라도 트랜잭션의 결과가 영구적으로 저장되어야 합니다.
이러한 특징들은 데이터 모델링에서 트랜잭션이 데이터베이스의 안전하고 신뢰할 수 있는 상태를 유지하는 데 얼마나 중요한 역할을 하는지를 나타냅니다.
| Q. 문제 | 트랜잭션 중에 '롤백(Rollback)'이란 무엇을 의미하나요? |
|---|---|
| A | 트랜잭션이 성공적으로 완료되어 모든 변경 사항이 데이터베이스에 반영되는 과정 |
| B | 트랜잭션 처리 중 발생한 오류로 인해 트랜잭션을 시작하기 전의 상태로 데이터를 복구하는 과정 |
| C | 데이터베이스에 저장된 데이터를 백업하여 재해 발생 시 복구할 수 있도록 하는 과정 |
| D | 여러 트랜잭션을 동시에 처리하면서 발생할 수 있는 충돌을 해결하는 과정 |
정답
롤백(Rollback)은 트랜잭션이 처리 중에 오류가 발생하거나, 어떠한 이유로 트랜잭션을 정상적으로 완료할 수 없을 때 사용하는 연산입니다. 이 과정을 통해 트랜잭션의 시작 지점 이전의 상태로 데이터베이스를 복구함으로써, 데이터의 일관성과 무결성을 유지할 수 있습니다.
| Q. 문제 | 데이터베이스 관리 시스템에서 트랜잭션이 성공적으로 처리되어 데이터베이스의 일관성을 유지하려면 트랜잭션은 ACID 속성을 만족해야 합니다. 다음 중 ACID 속성에 대한 설명으로 가장 부적절한 것은 무엇인가요? |
|---|---|
| A | 원자성(Atomicity): 트랜잭션 내의 모든 작업은 완전히 수행되거나 전혀 수행되지 않아야 합니다. |
| B | 일관성(Consistency): 트랜잭션이 완료된 후에는 데이터베이스가 일관된 상태를 유지해야 합니다. |
| C | 격리성(Isolation): 하나의 트랜잭션이 실행되는 동안 다른 트랜잭션의 연산이 끼어들 수 있습니다. |
| D | 지속성(Durability): 트랜잭션이 성공적으로 완료되면, 그 결과는 시스템이 고장 나더라도 영구적으로 반영됩니다. |
정답
ACID 속성은 데이터베이스 트랜잭션의 신뢰성을 보장하기 위한 네 가지 기본 원칙입니다. 격리성(Isolation)은 각 트랜잭션이 독립적으로 실행되어야 하며, 다른 트랜잭션의 연산이 끼어들어서는 안 된다는 원칙을 의미합니다. 올바른 격리성 설명은 트랜잭션의 변경사항이 다른 트랜잭션에 의해 간섭받지 않도록 보장해야 한다는 것입니다. 따라서 선택지 C는 격리성의 정확한 설명이 아니며, 이는 격리성의 목적과 반대되는 내용입니다.
Null은 데이터베이스에서 특정 필드 또는 칼럼에 값이 없음을 나타내는 특별한(중요한) 값입니다. Null은 '알 수 없음', '아직 정의되지 않음(미정)', '데이터 없음' 등으로 해석될 수 있습니다. 이는 어떤 데이터가 해당 필드에 대해 알려진 값이 없거나 적용할 수 없는 경우를 나타냅니다. Null 값은 ‘공백이나 숫자 0’과는 전혀 다른 의미입니다.
집계 함수는 대부분 Null 값을 제외하고 처리되기도 합니다. 이는 데이터베이스에서 Null 값이 특별한 상황을 나타내거나 연산에서 불확실한 결과를 가져오기 때문입니다. 다음은 이에 대한 설명과 예시입니다.
Null + 2 or 2 + Null -> Null Null - 2 or 2 - Null -> Null Null * 2 or 2 * Null -> Null Null / 2 or 2 / Null -> Null
SUM 함수:
SUM 함수는 합계를 계산하는 함수입니다. 일반적으로 Null 값을 0으로 처리합니다. 따라서 Null 값을 제외하고 나머지 값들의 합을 계산합니다.SELECT SUM(column_name) FROM table_name;
AVG 함수:
AVG 함수는 평균을 계산하는 함수입니다. Null 값을 제외하고 나머지 값들의 평균을 계산합니다.SELECT AVG(column_name) FROM table_name;
COUNT 함수:
COUNT 함수는 행의 개수를 세는 함수입니다. 일반적으로 Null 값을 제외하고 유효한 값들의 개수를 세어줍니다. 단, COUNT(*) 의 경우 NULL을 포함해서 모든 행의 수를 리턴합니다.SELECT COUNT(column_name) FROM table_name;
MIN/MAX 함수:
MIN과 MAX 함수는 최소값과 최대값을 찾는 함수입니다. Null 값을 무시하고 나머지 값 중에서 최소값과 최대값을 찾습니다.SELECT MIN(column_name), MAX(column_name) FROM table_name;
| ID | Score |
|---|---|
| 1 | 90 |
| 2 | Null |
| 3 | 85 |
| 4 | 95 |
AVG(Score)를 실행하면 Null 값인 2번 레코드는 무시되고, (90 + 85 + 95) / 3의 평균이 계산됩니다.MIN(Score)와 MAX(Score)를 실행하면 Null 값인 2번 레코드는 무시되고, 각각 85와 95가 반환됩니다.NULL 이 포함된 연산/집계를 해야할 경우 대부분 제외되고 처리되며, 보통은 NVL / ISNULL함수 등을 사용해서 NULL 값을 핸들링함.
| Q. 문제 | 데이터베이스에서 NULL 값의 특징에 대해 가장 정확한 설명은 무엇인가요? |
|---|---|
| A | NULL은 0 또는 빈 문자열("")과 동일한 의미를 가진다. |
| B | NULL은 필드에 데이터가 존재하지 않거나 알려지지 않은 값을 표현한다. |
| C | 모든 데이터베이스 시스템은 NULL 값을 저장할 수 없다. |
| D | NULL 값 비교 연산(=, <, >)은 항상 TRUE를 반환한다. |
정답
NULL은 무언가 알려지지 않았거나 적용되지 않는 상태를 나타내기 때문에, NULL 값에 대한 일반적인 비교 연산은 TRUE나 FALSE를 반환하지 않고, 대신 UNKNOWN을 반환하는 경우가 많습니다(이는 데이터베이스 시스템에 따라 다를 수 있음). 따라서 선택지 B가 가장 정확한 설명입니다.
| Q. 문제 | 다음 중 데이터베이스의 집계 함수와 NULL 값의 관계에 대한 설명으로 가장 정확한 것은 무엇인가요? |
|---|---|
| A | SUM() 함수는 NULL 값을 0으로 간주하여 합계에 포함한다. |
| B | AVG() 함수는 NULL 값이 있는 행을 제외하고 평균을 계산한다. |
| C | COUNT(컬럼명) 함수는 NULL 값을 포함한 모든 행을 계산한다. |
| D | MIN() 함수는 NULL 값을 최소값으로 고려하여 결과에 포함한다. |
정답
AVG() 함수는 NULL 값이 있는 행을 제외하고 평균을 계산한다.
엔터티내에서 어커런스(데이터)를 구분할 수 있는 구분자를 식별자라고 한다. 속성 또는 속성 그룹을 말한다.
업무에 의해 만들어진 식별자
정의
장점
단점
업무적으로 만들어지지는 않지만 본질식별자가 복잡한 구성을 갖고 있으므로 인위적으로 만든 식별자
정의
장점
단점

본질 식별자가 이보다 더 복잡해질 수도 있다.
그럼 어떻게 해야 더 편할까? 🤔

묶어서 쓰지말고 그냥 하나 쓰면 되지 !
이러면 모든 게 해피할까?
외부식별자(External Identifier)를 사용하더라도 중복 데이터를 막을 수 없습니다. 외부식별자는 엔터티를 식별하는데 사용되지만, 이는 해당 엔터티의 속성과는 무관하게 외부적으로 제공되는 값이기 떄문입니다. 따라서 엔터티의 속성이 중복되더라도 외부식별자가 다르면 각각의 행은 다르게 식별됩니다.
예를 들어, 학생 정보를 저장하는 데이터베이스에서 시퀀스 번호를 외부식별자로 사용한다고 가정해봅시다.
| 번호 | 이름 | 전공 | 성별 |
|----------|----------|-----------|-----|
| 1 | Alice | Computer | 여성 |
| 2 | Bob | Biology | 남성 |
| 3 | Alice | Physics | 여성 |
이 경우, 이름과 전공이 중복되더라도 번호가 다르면 각 행은 다르게 식별됩니다.
데이터베이스가 데이터를 빠르게 찾기위해 순서를 유지하고 있는 데이터
(보통 PK로 설정된 컬럼은 자동적으로 INDEX가 걸려있음)
ex) 번호 맞추기 (B Tree, B+Tree)
단점을 고려할 때, 데이터 모델링 시에는 각각의 상황에 맞게 적절한 식별자를 선택하고, 이에 따라 인덱스를 효율적으로 관리하는 것이 중요합니다.
| Q. 문제 | 본질식별자의 주요 장점 중 하나가 아닌 것은 무엇인가요? |
|---|---|
| A | 본질식별자는 엔터티 내에서 자연스럽게 발생하는 속성을 기반으로 합니다. |
| B | 본질식별자는 시스템이나 데이터베이스 설계 목적으로 인위적으로 생성됩니다. |
| C | 본질식별자는 데이터의 의미를 포함하므로 인간이 이해하기 쉽습니다. |
| D | 데이터 속성의 변화가 본질식별자에 영향을 미칠 수 있습니다. |
정답
본질식별자는 자연스러운 데이터 속성을 기반으로 하며, 엔터티가 자연적으로 갖고 있는 속성을 활용하여 식별자로 사용됩니다. 인위적으로 생성되는 식별자는 인조식별자(Surrogate Key)를 의미합니다.
| Q. 문제 | 인조식별자(Surrogate Key)의 주요 장점 중 하나가 아닌 것은 무엇인가요? |
|---|---|
| A | 데이터베이스의 일관성과 데이터 변화에 대한 영향이 적습니다. |
| B | 복잡한 본질식별자를 대체하여 데이터 모델의 단순화를 도모할 수 있습니다. |
| C | 인조식별자는 데이터와 밀접한 의미를 가지고 있어 사용자가 쉽게 이해할 수 있습니다. |
| D | 중복되지 않도록 관리가 필요하지만, 엔터티를 고유하게 식별하는 데 효과적입니다. |
정답
인조식별자는 데이터와 직접적인 의미적 연관이 없는 인위적으로 생성된 식별자입니다. 따라서 사용자가 직접 읽고 이해하기 어려운 경우가 많으며, 주로 시스템 내에서 데이터를 유일하게 식별하기 위한 목적으로 사용됩니다.