데이터베이스 설계를 하기 위해 데이터 모델링을 공부하고 있습니다.
요구사항 분석-개념적 모델링- 논리적 모델링- 물리적 모델링 단계를 거쳐 데이터베이스를 설계하는 것이 일반적이긴 하기에 이 방법대로 진행하고 있습니다.
- 요구사항 분석 : 저장이 필요한 요소가 어떤게 있는지 모아서 정리
- 개념적 모델링: 중요 개념을 기준으로 핵심 Entity 도출, ERD 작성
- 논리적 모델링: Entity를 구체화하고 상세 속성을 작성, 엔티티간 관계 정의 및 정규화, ERD 세부작성
- 물리적 모델링: 데이터베이스 생성 계획에 따라 개체 인덱스 등을 생성, 테이블 및 인덱스 설계
모델링을 하는데 있어 데이터 관점(데이터 위주), 프로세스 관점(처리과정 위주), 상관 관점(데이터와 처리과정의 적절한 조합)에서 모델링을 한다고 합니다.
여기서 관계란 무엇인지 정의해본다면, 두 개의 테이블 간의 관계를 의미하는 것입니다.
설계하는데 있어 테이블간 연결이 필요한 경우 관계를 어떻게 설정하는 것이 좋은가?가 고민됩니다.
또한 관계라는 것이 꼭 필요한 것인가? 를 생각해본다면 관계가 필요없을 수도 있고, 독립적으로 사용될 수도 있습니다.
그러나 관계형 DB를 사용하는 목적을 생각한다면, 엔티티를 생성하는데 다음의 특징이 지켜지도록 설계해야 합니다.
- ⓐ 업무에서 쓰이는 정보여야함.
- ⓑ 식별자는 유니크함이 보장되어야함.
- ⓒ 인스턴스가 2개 이상 존재해야 함.
- ⓓ 속성을 반드시 가져야 함.
- ⓔ 다른 엔티티와 1개 이상의 관계를 가지고 있어야 함.
실제로 업무에 사용하는데 있어 이런 특성이 적용되어야 이후 운영하는데 있어 유리할 것이기 때문에 설계할때도 고려해야 하는 점이라고 합니다.
단순히 관계에 상관 없이 필요한 테이블을 만들어 원하는 속성을 지정하고 데이터를 쓰고 읽는 것도 가능하며, 관계없는 여럿 독립적인 테이블을 만들고 사용해도 될텐데, 왜 굳이 테이블간에 관계를 고려해야 할까요?
이는 데이터 중복 저장을 방지하거나, 데이터의 최신성을 명확히 하여 최소한의 자원으로 정확도 높은 데이터베이스를 사용하기 위함이라 생각됩니다.
데이터베이스는 비싸니까요.
그렇다면 관계를 구분하는데 있어 기준이 무엇일까요?
크게 2가지 기준을 확인할 수 있었습니다.
- 존재 관계: 존재 자체로 연관성이 있는 관계를 말합니다. (직원 - 부서, 학생 - 학과)
- 행위 관계: 특정 행위를 함으로써 연관성이 생기는 관계를 말합니다. (회원 - 주문, 학생 - 출석부, 콘서트- 콘서트티켓)
이런 관계를 기반으로 테이블간에 관계가 정의될 수 있습니다.
-----------------------------------------------------------------------------------------
테이블간 관계를 정의하기 위해 테이블의 식별자(Identifiers)를 사용합니다.
식별자란, 엔티티의 속성 중에서 각각의 인스턴스를 구분 가능하게 만들어주는 대표적인 속성을 의미합니다.(학번, 군번, 사번 같은 개념)
식별자도 종류가 있습니다.
ⓐ 대표성 여부
- 주식별자 : 기본키, PK에 해당하는 속성이며, 하나의 속성 또는 여러 속성이 주식별자가 될 수 있습니다.(유일, 최소 개수의 속성, 불변성, 반드시 존재(notnull) )
- 보조식별자 : 인스턴스를 식별할 수 있지만, 대표 식별자가 아니며, 다른 엔티티와 참조관계로 연결되지 않음.
ⓑ 스스로 생성되었는지 여부
- 내부식별자 : 엔터티 내부에서 스스로 생성된 식별자
- 외부식별자 : 다른 엔터티에서 온 식별자
ⓒ 단일 속성의 여부
- 단일식별자 : 하나의 속성으로 구성된 식별자
- 복합식별자 : 두개 이상의 속성으로 구성된 식별자
ⓓ 대체 여부
- 원조식별자 : 업무 프로세스에 존재하는 식별자, 가공되지 않은 원래의 식별자(본질식별자)
- 대리식별자 : 주식별자의 속성이 두 개 이상인 경우 그 속성들을 하나로 묶어서 사용하는 식별자(인조식별자)
주식별자를 자식 엔티티에 어떻게 상속하느냐에 따라 식별관계와 비식별관계로 나눌 수 있습니다.
이를 관계 타입(식별 관계, 비식별 관계) 이라고 하며,
식별 관계(Identification Relationship)를 부가적으로 정리하자면, 참조할 상위 테이블의 주 식별자를 하위 테이블의 주 식별자에 포함시키는 것을 주 식별자 라고 합니다.
상위 테이블의 식별자가 없다면, 하위 테이블 에도 데이터가 존재할 수 없다보니 관련된 데이터는 자동으로 삭제됩니다.
또한 식별관계일 때 주 식별자를 인덱스로 사용할 수 있으며, 상위/하위 엔티티를 동시에 조회 하는 경우에 효율적입니다.
비식별 관계(Non-Identification Relationship)는 상위 테이블의 주 식별자가 하위 테이블에 일반 속성에 포함되는 관계입니다.(테이블간 느슨한 결합)
일반속성의 속성값은 NULL이 될 수 있으므로, 상위 테이블에 없는 내용 또한 하위 테이블에 생성 가능합니다.
또한, 반드시 상위 테이블에서 가져온 식별자를 외래키로 잡을 필요는 없습니다.
이런 관계를 생각해서 테이블을 설계하여 그림으로 표현하는 방식이 있습니다.
이를 ERD라고 하는데, 대표적으로 까마귀 발 ERD를 많이 쓰는 것 같아. 해당 ERD의 이미지 표기법을 첨부해서 가져왔습니다.
유선배님 강의를 참고했습니다.
감사합니다.
'IT기술 > DB' 카테고리의 다른 글
[Postgre] AutoCommit 테스트해보기 (0) | 2024.02.23 |
---|---|
[DB, JBDC] 데이터베이스 연결, JDBC, SQL Mapper, ORM 정리 (0) | 2024.01.29 |
[Mysql] LEFT JOIN 이용하는방법. (NOT IN 대체하기) (0) | 2023.07.31 |
[OracleDB] 오라클 DB 계정 생성하기, 21c 버전 (1) | 2023.07.17 |
[OracleDB] 오라클 DB 설치 및 사용방법(Express Edition(XE), sql plus, sql developer) (2) | 2023.07.17 |