[SQLD] 데이터 모델과 SQL - 관계/조인, 트랜잭션, Null속성, 본질 vs 인조 식별자 요약

1.관계와 조인의 이해

관계의 이해

관계의 이해'는 데이터 모델링의 핵심 개념 중 하나다. 데이터베이스의 관계는 데이터 간의 연관성을 나타내며, 이를 통해 데이터를 구조화하고, 효율적인 데이터 관리와 정확한 정보 추출이 가능해진다. 여기서 살펴볼 주요 개념은 엔티티 간의 관계, 관계의 종류, 그리고 관계를 표현하는 방법이다.

 

엔티티 간의 관계

엔티티(Entity)

데이터베이스에서 데이터 객체를 의미한다. 예를 들어, '고객', '주문', '제품' 등이 엔티티가 될 수 있다.


관계(Relationship) 

엔티티들 사이의 연관성이다. 예를 들어, '고객'이 '주문'을 하는 관계이다.

 

관계의 종류

일대일 관계 (One-to-One)
하나의 엔티티 A가 하나의 엔티티 B와만 관계를 가질 때를 말한다. 예시로 각 사용자는 하나의 프로필을 가지고, 각 프로필은 특정 사용자에게만 속한다.


일대다 관계 (One-to-Many)

하나의 엔티티 A가 여러 개의 엔티티 B와 관계를 가질 수 있지만, B는 A와 하나의 관계만을 가질 때를 말한다. 예시로 한 명의 고객이 여러 개의 주문을 할 수 있지만, 각 주문은 특정 고객에게만 속한다.

 

다대다 관계 (Many-to-Many)

하나의 엔티티 A가 여러 개의 엔티티 B와 관계를 맺을 수 있으며, B 또한 여러 개의 A와 관계를 맺을 수 있을 때이다. 예시로 여러 명의 학생이 여러 개의 수업에 등록할 수 있고, 각 수업에는 여러 명의 학생이 등록될 수 있다.

 

관계의 표현 방법

외래 키 (Foreign Key)
한 테이블의 필드(열)가 다른 테이블의 기본 키를 참조하는 경우, 이를 외래 키라고 한다. 외래 키를 통해 테이블 간의 관계를 정립하고 데이터의 무결성을 유지한다.

 

조인 (Join)
SQL에서는 두 테이블 간의 관계를 기반으로 데이터를 결합하기 위해 조인을 사용한다. 예를 들어, 고객 테이블과 주문 테이블을 고객 ID를 기준으로 조인하여, 각 고객의 주문 내역을 조회할 수 있다.

 

ERD (Entity-Relationship Diagram)

엔티티 간의 관계를 시각적으로 나타내는 다이어그램이다. ERD는 데이터 모델링의 초기 단계에서 엔티티와 그 관계를 명확하게 파악하는 데 도움을 준다.

 

조인의 이해

SQL (Structured Query Language):

데이터베이스에서 데이터를 조회, 추가, 수정, 삭제하는 데 사용되는 표준 언어이다. 기본적인 SQL 구문에는 SELECT, INSERT, UPDATE, DELETE 등이 있다.

조인 (Join):

두 개 이상의 테이블을 연결하여 데이터를 조회하는 방법이다. 다양한 종류의 조인이 있으며, 각각은 서로 다른 방식으로 데이터를 결합한다.

조인의 종류:

내부 조인 (Inner Join)

두 테이블의 교집합에 해당하는 데이터를 조회한다.

 

외부 조인 (Outer Join)

한쪽 테이블의 모든 데이터와 다른 테이블의 일치하는 데이터를 조회한다. 외부 조인에는 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있다.

 

크로스 조인 (Cross Join) 또는 카테시안 조인

두 테이블의 모든 가능한 조합을 반환한다.

 

자연 조인 (Natural Join)

두 테이블 간에 동일한 이름을 가진 모든 열에 대해 내부 조인을 수행한다.

 

조인 조건 및 ON 절
조인을 수행할 때, ON 절을 사용하여 조인 조건을 명시한다. 예를 들어, 두 테이블 A와 B를 조인할 때, A.id = B.id와 같은 방식으로 조인 조건을 지정할 수 있다.

 


 

2. 트랜젝션

트랜잭션

트랜잭션은 데이터베이스에서 하나의 논리적인 작업 단위를 의미한다. 이는 여러 개의 개별 작업들이 모여서 하나의 큰 작업을 이루는 경우가 많다. 예를 들어, 은행 계좌에서 돈을 이체하는 과정은 여러 개의 단계(잔액 확인, 금액 차감, 수취인 계좌에 금액 추가)를 포함한다. 이 모든 단계가 성공적으로 수행되어야만 최종적으로 '이체'라는 트랜잭션이 완료되는 것이다.


트랜잭션의 중요성

데이터베이스에서 트랜잭션은 데이터의 일관성과 무결성을 유지하는 데 중요한 역할을 한다. 트랜잭션은 다음 네 가지 주요 속성(ACID)을 보장한다.

원자성(Atomicity)

트랜잭션 내의 모든 작업이 완전히 수행되거나, 아무것도 수행되지 않아야 한다.

 

일관성(Consistency)

트랜잭션이 성공적으로 완료되면, 데이터베이스는 일관된 상태를 유지해야 한다.

 

독립성(Isolation)

동시에 실행되는 여러 트랜잭션이 서로에게 영향을 주지 않아야 한다.

지속성(Durability)

트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 데이터베이스에 반영되어야 한다.

 

트랜잭션 관리

데이터베이스 시스템은 이러한 트랜잭션을 관리하기 위해 다양한 메커니즘을 제공한다. SQL에서는 BEGIN TRANSACTION과 COMMIT 명령어를 사용하여 트랜잭션을 시작하고 완료할 수 있으며, 오류가 발생한 경우 ROLLBACK 명령어로 모든 변경 사항을 취소할 수 있다.


 

3. NULl 속성의 이해

데이터베이스를 다루다 보면 자주 마주치는 개념 중 하나가 바로 'NULL'이다. 많은 이들이 NULL을 단순히 '없음' 또는 '비어있음'으로 이해하지만, 실제로는 좀 더 복잡한 의미를 갖는다. 

NULL의 정의

데이터베이스에서 NULL은 '알 수 없음(unknown)' 또는 '정보 없음(no data)'을 나타낸다. 이는 필드에 값이 '없음'을 의미하지만, 그 이유는 다양할 수 있다. 값이 존재하지 않을 수도 있고, 아직 정해지지 않았거나, 알 수 없을 수도 있을 것이다.

NULL의 중요성

NULL 값은 데이터의 무결성을 유지하는 데 중요한 역할을 한다. 예를 들어, 사용자의 전화번호가 아직 알려지지 않았다면, 그 필드는 NULL로 남겨둠으로써 '정보가 없음'을 명확히 할 수 있다. 이는 잘못된 정보나 추측으로 데이터를 채우는 것보다 훨씬 낫다.

NULL을 다루는 방법

NULL 확인

SQL에서는 IS NULL 또는 IS NOT NULL 조건을 사용하여 NULL 값을 확인할 수 있다.

SELECT * FROM users WHERE address IS NULL;


NULL과 비교

NULL은 다른 값과 직접 비교할 수 없다. 예를 들어, NULL = NULL은 FALSE가 아니라 '알 수 없음'을 반환한다.


NULL의 처리

데이터베이스 설계 시, 어떤 필드가 NULL 값을 가질 수 있는지, 그리고 어떤 의미를 가지는지 명확하게 해야 한다. 또한, 애플리케이션 로직에서도 NULL 값을 적절히 처리할 준비가 되어 있어야 한다.

NULL 사용 주의

NULL 값을 가진 필드에 대한 연산은 대부분 NULL 결과를 반환한다. 예를 들어, NULL + 10은 NULL을 반환합니다.


 

4. 본질식별자 vs 인조식별자

데이터베이스 설계 과정에서 가장 중요한 결정 중 하나는 각 엔티티의 식별자를 어떻게 결정할 것인가이다. 이 때, 주로 두 가지 유형의 식별자가 사용된다. 본질식별자(Natural Identifier)와 인조식별자(Artificial or Surrogate Identifier). 이 두 가지 식별자의 개념과 차이점, 그리고 언제 어떤 식별자를 사용해야 하는지에 대해 알아보자.

 

본질식별자(Natural Identifier)

본질식별자는 엔티티의 자연스러운 속성을 기반으로 한 식별자이다. 이는 엔티티에 자연적으로 내재된 데이터를 반영한다.

예시

사람의 경우, 국적과 주민등록번호의 조합
자동차의 경우, 차량 번호판

 

특징

유일성: 엔티티를 유일하게 식별할 수 있다.
의미적 가치: 본질식별자는 비즈니스에 의미를 가지는 실제 데이터를 반영한다.
변경 가능성: 본질식별자는 실제 세계의 변화에 따라 변경될 수 있다.

 

인조식별자(Artificial or Surrogate Identifier)

인조식별자는 엔티티를 식별하기 위해 인위적으로 생성된 식별자이다. 이는 엔티티의 자연스러운 속성과는 관련이 없다.

 

예시

데이터베이스에서 자동으로 생성되는 일련번호나 고유 ID
UUID (Universally Unique Identifier)

 

특징

유일성: 각 엔티티에 대해 고유한 값을 갖는다.
불변성: 한 번 생성된 인조식별자는 변경되지 않는다.
비의미적: 인조식별자는 비즈니스 의미를 내포하지 않는다.


본질식별자 vs 인조식별자: 언제 무엇을 사용할까?

변경 가능성: 만약 식별자가 변경될 가능성이 있다면, 인조식별자 사용이 바람직하다. 본질식별자는 변경될 가능성이 있기 때문에 데이터 무결성에 문제를 일으킬 수 있기 때문이다.


복잡성: 복잡한 본질식별자(예: 여러 속성의 조합)는 관리가 어려울 수 있으므로, 이 경우 인조식별자를 사용하는 것이 좋다.


비즈니스 의미: 비즈니스 프로세스나 규칙에서 중요한 의미를 가지는 식별자가 필요한 경우, 본질식별자를 사용할 수 있다.