[DB] ERD 관계 / 식별자 관계 / 1:1 & 1:N & N:M
ERD (Entity Relationship Diagram)
- ERD란 Entity Relationship Diagram의 약자로, DB에서 존재하는 것들의 관계를 도표로 나타낸 것이다.
- 테이블이 어떤식으로 구성되어있고, 어떻게 어떤 테이블과 연결되어있는지 등을 나타낸다.
Entity && Attribute
- 정의 가능한 사물이나 개념 또는 객체등을 의미한다.
- 개념으로는 프로필, 자기소개등이 있고
- 이벤트로는 거래등이 존재할 수 있다.
- 데이터베이스에서 테이블의 구조라 보면 된다.
- 엔티티는 속성(Attribute)를 포함하고 있다.
- 위는 Article 엔티티이며, 게시글 엔티티의 속성으로는 article_id, title, content, post_date, edit_date, author가 있다.
- 엔티티속성 즉, 위 엔티티의 행 하나하나는 테이블의 열(column)에 해당한다.
Entity domain
- 도메인이란 속성의 값으로 존재할 수 있는 범위를 말한다.
ERD 키
- Entity에서 key를 표현할 수 있는데, 위와같이 금색 열쇠 아이콘으로 표시를 PK로 본다.
- 프로그램마다 ◆나 열쇠 등 다양한 방식으로 표현함.
- 그 아래에는 분홍색 열쇠 아이콘이 있는데 이는 FK를 나타낸다.
Entity 관계
식별자/비식별자 관계
- entity의 관계를 나타낼때 선을 이어 관계를 나타내는데, 실선과 점선으로 나뉘어진다.
- 실선은 식별자 관계를 나타내며, 부모 테이블의 기본키를 자식 테이블이 가지고 있으며 이를 기본키로 사용하는 경우이다.
- 점선은 비식별자 관계를 나타내며, 부모 테이블의 기본키를 자식테이블이 가지고 있지만 이를 기본키로 사용하지 않을 때 사용한다.
- 식별자와 비식별자의 특징은 다음과 같다.
항목 | 식별자 관계 | 비식별자 관계 |
---|
목적 | 강한 연결관계 표현 | 약한 연결관계 표현 |
의미 | 자식 주식별자의 구성에 포함됨 | 자식 일반속성에 포함됨 |
표기법 | 실선 표현 | 점선 표현 |
- 위의 관계의 경우 부모 테이블인 article테이블의 기본키를 자식 테이블인 comment테이블에서 외래키로 사용하므로(기본키로 사용하지 않으므로) 비식별자 관계인 점선을 사용해 나타내었다.
Cardinality & 필수참여 조건
- Cardinality는 한 개체에서 발생할 수 있는 발생 횟수를 정의하며, 다른 개체에서 발생할 수 있는 발생 횟수와 연관된다.
- entity와 entity의 대표적인 관계는 다음과 같다.
- One to one -> 1:1(1대1)
- One to many -> 1:M(1대다)
- Many to many -> M:N(다대다)
- 필수참여 조건이란 엔티티와 엔티티의 관계를 나타낼 때 한 엔티티가 다른 엔티티를 필수적으로 가지고 있는지 안그래도 되는지를 나타낼 때 사용한다.
- 연결선의 끝부분이 O아이콘이 함께 있다면 선택참여로 있어도 되고 없어도 된다.
- 연결선의 끝부분이 십자선 아이콘이 함께 있다면 필수참여로 반드시 있어야 한다.
- 세갈래로 나뉘어지는 경우도 있는데 이는 1개 이상을 의미한다.
- 세가지를 조합해서 나타내기도 한다.
1:1
- 1대1로 매칭되는 관계
- 대표적인 예: 학생과 신체정보
- 한명의 학생은 한가지 신체정보만 가질 수 있다.
- 위 관계의 경우 학생 테이블의 기본키가 신체정보 테이블의 외래키로 사용되는 동시에 기본키로 사용된다.
- 따라서 식별자 관계로 선을 연결할 때 실선으로 나타내었으며, 학생 한명당 신체정보는 하나만 가질수 있기 때문에 1대1 관계이다.
- 아래에서 따로 설명하겠지만 위처럼 1대1 관계의 경우 선의 끝부분이 3갈래로 나뉘지 않고 한줄로 이어진다.
- 또한 추가로 학생 한명당 신체정보는 무조건 가지고 있으므로, 이또한 표기법이 존재하는데 가로로 한줄(십자모양) 표기해준다.
- 위의 관계를 봤을떄, 1대1관계, 식별자 관계, 필수적으로 있는 관계라는 정보를 얻을 수 있다.
1:N
- 1대 다수로 매칭되는 관계.
- 대표적인 예: 학생과 취미(들)
- 한명의 학생이 취미를 가지지 않을수도, 한개만 가질수도, 여러개를 가질 수도 있다.
- 위의 경우 학생 테이블의 기본키가 취미 테이블의 기본키이자 외래키로 사용되므로 식별자관계인 실선으로 관계를 나타내었고, 취미 엔티티의 끝부분의 선을 보면 O모양으로 되어있는데 이 아이콘은 취미가 없을수도 있다는것을 나타낸다. 또한 가장 끝을 보면 선이 세갈래로 나뉘어져있는데 이는 취미가 여러개를 가질 수도 있다는 것을 나타낸다. 마지막으로 십자모양으로 가로선도 있으므로 1개만 있을수도 있다는 것을 나타낸다.
- 종합한다면 취미 테이블은 학생테이블의 기본키를 외래키이자 기본키로 사용하며, 학생이 취미를 0개부터 1개이상 가질 수 있음을 나타낸다.
N:M
- 그런데 사실 학생과 취미 관계의 경우 학생들이 중복되는 여러개의 취미를 가질수도 있고, 취미들도 여러명의 학생을 포함할 수 있다. (다대다 관계).
- 두 엔티티가 다대다 관계에 있는 경우 데이터 모델링에서는 N:M관게를 완성되지 않은 모델로 간주하며, 두 엔티티의 관계를 1:N, N:1로 조정하는 작업이 필요하다.
- 두 엔티티의 관련성을 표현하기 위해, 중간에 또다른 엔티티를 필요로 한다. 이 중간의 엔티티가 두 엔티티의 고유 속성 역할을 담당한다.
- 따라서 1:N관계의 예시에서 가져온 위의 엔티티를 아래와 같이 수정할 수 있다.
- 대표적인 예: 여러 학생들의 취미와 여러개의 취미들.
- 다대다 관계의 가운데에서 연결해주는 테이블을 매핑 테이블, 조인 테이블 이라하며, 여기서 중요한 점은 이런식으로 매핑 테이블을 생성하더라도, 매핑 테이블의 기본키 또한 반드시 있어야 한다.
- 학생_취미 테이블의 경우 학생 테이블의 기본키를 외래키로 사용하며 또한 취미 테이블의 기본키를 외래키로 사용한다.
- 이게 무슨소리인지 이미지와 함께 설명하기 위해 다시 그림[1]로 돌아가 엔티티로 테이블을 만든 아래 그림을 본다면
- 위처럼 학생 테이블과 취미 테이블이 있고 각 테이블의 아이디가 기본키로 구성되어있다(노란색).
- 학생은 여러개의 취미를 가질수 있으며 동시에 취미또한 여러 학생이 가질 수 있으므로, N:M관계가 성립되고 이를 테이블로 예시를 들어 나타내면 아래와 같다.
- 학생 테이블의 입장에서 학생의 취미를 확인하기 위해 그리고 취미 테이블의 입장에서 어떤 학생이 해당 취미를 가지는지 확인하기 위해 위와 같은 관계가 형성된다.
- 학생 테이블에 취미 테이블의
interest_id
컬럼을 외래키로 사용.
- 취미 테이블에 학생 테이블의
student_id
컬럼을 외래키로 사용.
- 이런식으로 N:M을 직접적으로 연결한다면 어떤 문제점이 발생할까?
N:M을 1:N으로 바꾸는 이유
s_2
학생의 취미 목록을 확인하기 위해서 학생 테이블을 확인해야 하는가? 아니면 취미 테이블을 확인해야 하는가?
s_2
학생이 이름, 주소, 전공중 하나라도 변경한다면?
- 그래서 우리는 위의 N:M관계를 아래와 같이 1:N, 1:M으로 관계를 풀어 나타낼 수 있다.
- 양쪽의 기본키를 두개다 가져와서 외래키로 사용한다.
- 주의할점은 당연히 연결 해주는 테이블의 경우 PK를 따로 가지고 있어야 한다.
- 이같이 연결한다면 위에서 설명했던 문제점들을 해결할 수 있다.
내용 참고하다 궁금한점이 있는데요
식별자 관계에서 부모와 자식 동일한 기본키를 사용하는데 1:N이 성립이 되는게 맞나요?