관계와 참조 무결성
쉽게 말하면
고객 테이블과 주문 테이블을 '고객번호'로 이어 두면, 주문 하나만 봐도 어느 고객의 주문인지 알 수 있어요. 이렇게 테이블을 잇는 것을 관계라고 해요. '참조 무결성'을 켜면 없는 고객 번호로 주문을 넣는 실수를 Access가 막아 줘요.
시험용 정의
관계는 두 테이블에서 같은 의미의 값을 가진 필드를 이어 데이터를 함께 쓰게 하는 설정이다. 보통 한쪽 테이블의 기본 키와 다른 쪽 테이블의 외래 키를 잇고, 이어지는 두 필드는 데이터 형식이 같아야 한다(일련 번호는 숫자 정수(Long)와 이을 수 있다). [데이터베이스 도구] → [관계]에서 필드를 끌어다 놓으면 [관계 편집] 대화 상자가 나온다. 관계 종류는 양쪽 필드가 모두 기본 키면 일대일, 한쪽만 기본 키면 일대다로 자동 결정된다. 다대다는 두 테이블의 키를 함께 담는 연결 테이블을 만들어 일대다 관계 두 개로 표현한다. 항상 참조 무결성 유지를 켜면 참조하는 테이블(외래 키 쪽)에 참조되는 테이블에 없는 값을 넣거나 바꿀 수 없고, 참조되고 있는 '일' 쪽 레코드를 마음대로 지울 수 없다. 외래 키가 비어 있는(Null) 레코드는 허용된다. 이미 규칙을 어긴 데이터가 있으면 참조 무결성을 켤 수 없다. 참조 무결성을 켜야 고를 수 있는 관련 필드 모두 업데이트는 '일' 쪽 기본 키를 고치면 '다' 쪽 외래 키도 함께 바뀌게 하고, 관련 레코드 모두 삭제는 '일' 쪽 레코드를 지우면 그것을 참조하는 '다' 쪽 레코드도 함께 지운다. 조인 유형은 양쪽에 일치하는 것만 보이는 내부 조인, 왼쪽 테이블 레코드를 모두 보이는 왼쪽 우선 외부 조인, 오른쪽 테이블 레코드를 모두 보이는 오른쪽 우선 외부 조인이 있다.
비유로 이해하기
학교 명부(부서)와 출석부(사원)를 반 번호로 잇는 것이다. 참조 무결성은 '명부에 없는 반 번호는 출석부에 쓸 수 없다'는 규칙이다. 관련 레코드 모두 삭제는 반이 없어지면 그 반 학생 출석 기록도 함께 정리하는 규칙이다.
자세히
관계 종류
| 종류 | 예 | 만드는 법 |
|---|---|---|
| 일대일(1:1) | 사원 ↔ 사원 상세 | 양쪽 필드가 모두 기본 키(또는 중복 불가능 인덱스) |
| 일대다(1:N) | 고객 → 주문 | '일' 쪽은 기본 키, '다' 쪽은 외래 키 |
| 다대다(N:M) | 학생 ↔ 과목 | 연결 테이블(수강)을 두어 일대다 두 개로 |
참조 무결성을 켰을 때
| 작업 | 결과 |
|---|---|
| '다' 쪽(주문)에 없는 고객번호로 레코드 추가 | 막힌다 |
| '다' 쪽에 고객번호를 비워 두고 추가 (Null) | 가능 |
| '다' 쪽 레코드 삭제 | 언제나 가능 (무결성을 해치지 않음) |
| '일' 쪽(고객)에 새 레코드 추가 | 가능 |
| 주문이 있는 고객 삭제 | 막힌다. 관련 레코드 모두 삭제를 켰으면 주문도 함께 삭제 |
| 주문이 있는 고객의 고객번호 수정 | 막힌다. 관련 필드 모두 업데이트를 켰으면 주문 쪽도 함께 수정 |
참조 무결성을 켤 수 없는 경우
- '다' 쪽에 '일' 쪽에 없는 값이 이미 들어 있을 때 (예: 구매 목록의 고객번호가 고객 테이블에 없음)
- '일' 쪽 필드가 기본 키나 고유 인덱스가 아닐 때
- 이어진 두 필드의 데이터 형식이 다를 때
- 두 테이블이 서로 다른 Access 파일에 있을 때
'일' 쪽 값이 '다' 쪽에 하나도 없거나 여러 번 나오는 것은 문제가 아니다.
조인 유형
| 유형 | 결과에 나오는 레코드 |
|---|---|
| 내부 조인 | 양쪽 필드 값이 같은 레코드만 |
| 왼쪽 우선 외부 조인 | 왼쪽 테이블 전부 + 오른쪽에서 일치하는 것 |
| 오른쪽 우선 외부 조인 | 오른쪽 테이블 전부 + 왼쪽에서 일치하는 것 |
시험에 이렇게 나와요
- 관계 종류는 자동 결정, [관계 편집]에서 고를 수 없음
- 참조 무결성 → 외래 키 값은 참조되는 테이블에 있어야 함(Null은 허용)
- 외래 키 쪽 레코드 삭제·참조되는 쪽 레코드 추가 → 무결성 위배 없음
- 관련 레코드 모두 삭제 → '일' 쪽을 지우면 '다' 쪽 관련 레코드도 삭제
- '다' 쪽에 '일' 쪽에 없는 값이 있으면 참조 무결성을 설정할 수 없음
- 조인 유형 → 내부, 왼쪽 우선 외부, 오른쪽 우선 외부
확인 문제
Q1. [관계 편집] 대화 상자에서 할 수 없는 일은?
- 관련 레코드 모두 삭제 켜기
- 조인 유형 고르기
- 항상 참조 무결성 유지 켜기
- 관계 종류를 다대다로 직접 고르기
정답 보기
4번 관계 종류를 다대다로 직접 고르기
관계 종류는 이어진 필드가 기본 키(또는 고유 인덱스)인지에 따라 자동으로 정해진다. 다대다는 직접 고를 수 없고 연결 테이블로 만든다.
Q2. [학과]-[학생]이 학과코드로 이어져 참조 무결성과 '관련 레코드 모두 삭제'가 켜져 있다. [학과]에서 '경영' 레코드를 지우면?
- 학생의 학과코드만 Null로 바뀐다
- 학과 레코드만 지워지고 학생은 그대로다
- 경영 학과코드를 가진 학생 레코드도 함께 지워진다
- 학생이 있어서 지울 수 없다
정답 보기
3번 경영 학과코드를 가진 학생 레코드도 함께 지워진다
관련 레코드 모두 삭제는 '일' 쪽 레코드를 지울 때 그것을 참조하는 '다' 쪽 레코드를 함께 지운다.
Q3. 참조 무결성을 켠 상태에서 막히는 작업은?
- 고객 테이블에 새 고객 추가
- 주문 테이블의 레코드 삭제
- 주문 테이블에 고객 테이블에 없는 고객번호로 주문 추가
- 주문 테이블에 고객번호를 비워 두고 주문 추가
정답 보기
3번 주문 테이블에 고객 테이블에 없는 고객번호로 주문 추가
외래 키 값은 참조되는 테이블에 있는 값이거나 Null이어야 한다.
Q4. 학생과 과목처럼 다대다 관계를 Access에서 나타내는 방법은?
- 한 테이블에 과목1, 과목2 필드를 늘린다
- [관계 편집]에서 다대다를 고른다
- 두 테이블의 기본 키끼리 바로 잇는다
- 두 테이블의 키를 담은 연결 테이블을 두고 일대다 관계 두 개로 잇는다
정답 보기
4번 두 테이블의 키를 담은 연결 테이블을 두고 일대다 관계 두 개로 잇는다
다대다는 연결 테이블(예: 수강)을 만들어 일대다 두 개로 바꾼다.
Q5. 두 테이블을 이었을 때, 왼쪽 테이블의 레코드는 모두 보이고 오른쪽은 일치하는 것만 보이는 조인은?
- 내부 조인
- 오른쪽 우선 외부 조인
- 교차 조인
- 왼쪽 우선 외부 조인
정답 보기
4번 왼쪽 우선 외부 조인
내부 조인은 양쪽이 일치하는 레코드만 보인다.
헷갈리기 쉬운 O·X
참조 무결성을 설정하지 않아도 외래 키에는 참조되는 테이블에 있는 값만 넣을 수 있다.
정답 보기
X 참조 무결성을 켜지 않으면 이런 검사를 하지 않는다.
외래 키 값이 있는 테이블에서 레코드를 지우면 참조 무결성이 깨질 수 있다.
정답 보기
X 참조하는 쪽 레코드를 지우는 것은 아무 레코드도 고아로 만들지 않아 무결성을 해치지 않는다.