인프런 커뮤니티 질문&답변
MYSQL 코드 질문
작성
·
37
0

수업 외 질문을 가져와서 죄송합니다만 간략하게 한가지만 여쭙고 싶습니다.
이 Overlapping 과 Complete 을 동시에 만족하는 코드를 3개의 Table 을 통해서 구현할때 Trigger 를 쓰지 않고도 구현할 수 있나요? (단순히 Null, Check, IsStudent, IsFaculty 등을 이용해서요)
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
ghuhan18님께서 질문해주신 ER 다이어그램을 기반으로 Overlapping Complete 관계를 SQL에서 구현하는 방법에 대해 답변드리겠습니다.
Overlapping과 Complete 관계를 만족시키는 구현은 Triggers 없이도 SQL Constraints를 이용해 가능합니다. 이 관계는 Person, Student, Faculty의 테이블을 사용하여 구현할 수 있습니다.
- Person 테이블: 기본적인 개인의 식별 정보와 함께
is_student,is_faculty플래그를 boolean 속성으로 추가합니다.
- Student 테이블:
Person의UNI를 외래키로 사용하여 추가적인 학생 정보를 저장합니다.
- Faculty 테이블:
Person의UNI를 외래키로 사용하여 교수진의 정보를 저장합니다.
구현 예시:
CREATE TABLE Person (
UNI VARCHAR(10) PRIMARY KEY,
last_name VARCHAR(50),
first_name VARCHAR(50),
preferred_email VARCHAR(100),
default_email VARCHAR(100),
is_student BOOLEAN DEFAULT FALSE,
is_faculty BOOLEAN DEFAULT FALSE,
CHECK (is_student OR is_faculty) -- 최소 하나의 True: Complete 보장
);
CREATE TABLE Student (
UNI VARCHAR(10),
graduation_year INT,
major VARCHAR(100),
PRIMARY KEY (UNI),
FOREIGN KEY (UNI) REFERENCES Person(UNI),
CHECK (exists_student(UNI)) -- Student 테이블에 존재 시 Person의 is_student는 True
);
CREATE TABLE Faculty (
UNI VARCHAR(10),
title ENUM('Professor', 'Associate Professor', 'Assistant Professor', 'Instructor'),
department_code VARCHAR(50),
PRIMARY KEY (UNI),
FOREIGN KEY (UNI) REFERENCES Person(UNI),
CHECK (exists_faculty(UNI)) -- Faculty 테이블에 존재 시 Person의 is_faculty는 True
);
-- `exists_student` 와 `exists_faculty` 는 각각의 존재 여부를 체크하는 유닛 프로시저 또는 다른 방법이 필요합니다.
-- SQL에서 직접적인 기능은 없지만, 개념적으로 이해하는 방법입니다.
위의 예시에서는 Person 테이블이 최소 하나의 Role이 존재하도록 하고, 각 Role 테이블(Student, Faculty)이 해당 Role에 맞는 데이터를 갖도록 구현했습니다. 하지만 실제로 복잡한 데이터 무결성 검사를 위해서는 SQL Server 같은 몇 가지 데이터베이스에서 지원하지 않는 경우 트리거가 필요할 수도 있음을 고려하셔야 합니다.
추가적인 도움이 필요하면 언제든지 문의해 주세요!
감사합니다.





