일대다 관계
하나의 개체의 인스턴스가 다른 하나의 개체의 여러 인스턴스와 연관 된 관계를 일대다 관계라고 한다.
학생과 숙제의 관계를 예를 들어보자. 학생은 영희, 철수, 바둑이 있다고 하자. 모두 구분 된다. 철수가 과학 숙제, 수학 숙제, 도덕 숙제를 했다. 영희와 바둑이도 했다고 하자. 철수가 한 숙제들은 모두 구분된다. 하지만 숙제들 모두 철수가 한 것이다. 여기서 철수와 철수가 한 숙제들의 관계가 나온다. 철수는 과학 숙제, 수학 숙제, 도덕 숙제들을 했기 때문에 철수 한명에게 앞의 세개의 숙제가 연결된다. 하지만 숙제의 입장에서는 철수 하나만 연결된다. 철수가 했기 때문이다. 영희나 바둑이한테 연결 될 수는 없다.
이 관계를 추상화해보자. 학생 각각은 고유하다. 숙제도 각각 고유하다. 하지만 하나의 학생은 여러개의 숙제와 연결될 수 있다. 하나의 개체가 여러 개의 개체와 연관되어 있다. 이 관계가 일대다 관계이다.
참고로 숙제의 입장에서는 학생에 대해 다대일 관계이다. 어떤 것을 시작점으로 보느냐에 따라 표현 방식이 달라진다.
개체 간에 연결관계
개체마다 고유식별자가 있다. 학생과 숙제 모두 구분된다. 하지만 숙제는 학생에게 연결된다. 이때 숙제는 학생에 대한 정보를 갖고 있어야한다. 이는 학생의 고유식별자이다. 따라서 숙제에 저장된 학생의 고유식별자는 외래키가 된다. 즉, 숙제의 외래식별자는 학생의 고유식별자를 가리키고 있다.
구현
학생
CREATE TABLE student (
id SERIAL PRIMARY KEY,
first_name TEXT,
last_name TEXT
);
숙제
CREATE TABLE homework_submission (
id SERIAL PRIMARY KEY,
mark INTEGER,
student_id INTEGER REFERENCES student(id)
);
reference 키워드를 통해 student_id를 외래키로 만든다. student_id는 student의 id를 가리킨다.