큰일이 있어 공부를 못하고 시험7일이 남았지만...
7일을 알차게 채워보겠습니다
- 컬럼으로 표현할 수 있는 단위
- 더 이상 분리되지 않는 최소의 데이터 단위
- 예) 학생이라는 엔터티 = 이름, 학번, 학과번호가 속성이 됨
- 업무에 필요하고 관리하는 데이터여야함
- 정해진 주식별자에 함수적 종속성을 가지기
> 예) 학번이 달라지면 - 이름이 달라지는 것
- 하나의 속성에 하나의 값이 어야 한다 (=원자성)
- 한 속성의 값이 다른 값에 영향을 주는(1:1로 영향을 주는 관계)
1) 완전 함수적 종속
- PK의 전체가 종속 관계가 되는 것
- 예)
1번 사람/ 과일 주문 / 5개
2번 사람/ 음료 주문/ 3개
3번 사람/ 과일 주문/ 4개
--> 과일주문 또는 1번/ 3번 이라는 PK값이 주문 수량과 연관되지 않음
주문사람과 주문상품이 무조건 수량과 연관성이 있음
2) 부분 함수적 종속
- PK의 일부만으로도 종속 관계를 확인 할 수 있는 것
- 예)
1번 학생/ 영어/ A쌤
2번 학생/ 영어/ A썜
3번 학생/ 수학/ B쌤
--> 영어 또는 수학이라는 과목으로도 선생님이 누구인지 확인 가능
1. 속성의 특징에 따른 분류
- 기본 속성 : 기본적인 것(상품명)
- 설계 속성 : 설계를 위해 규칙화하는 새로운 것을 만드는 것(상품코드1)
- 파생 속성 : 일반적으로 계산된 값들(상품1의 평균 판매수)
2. 엔터티 구성방식에 따른 분류
- PK(Primary key, 기본키) : 인스턴스를 식별하는 속성
> 예) 사원코드
- FK(Foreign Key, 외래키) : 다른 엔터티와의 관계에서 포함된 속성(참조 속성)
> 예) 부서코드
- 일반 속성 : 엔터티에 포함되고 있고 위의 두개 포함 안되는 속성을 지칭
3. 분해 여부에 따른 속성
- 단일 속성 : 하나의 의미로 구성된 경우
> 예) 이름
- 복합 속성 : 여러개의 의미로 구성된 경우
> 예) 주소 (시, 구, 동 등으로 나누기 가능)
- 다중값 속성 : 여러개의 값을 가질 수 있는 경우
> 예) 한사람이 전화번호 여러개 가질수 있음
- 업무에서 사용하는 이름을 사용해야함
- 서술식 사용하지 않기
- 약어 사용하지 않기
- 전체 데이터 모델에서 유일하게 사용해야함
- 각 속성이 가질 수 있는 값이 범위를 의미
- 데이터 타입과 크기, 제약사항 등
- 인스턴스끼리 가지고 있는 연결고리를 잘 이해하고 정의하기
- 엔터티의 정의에 따라서 관계가 바뀌기도 함
1. 존재적 관계
- 하나의 엔터티가 다른 엔터티에 존재 영향을 주는 경우
> 사원 - 부서
부서의 엔터티 사라지면, 사원의 존재 자체에 영향을 줌
2. 행위적 관계
- 엔터티간의 행위적 영향이 있는것
> 고객 엔터티
고객이 주문함 / 주문 데이터가 쌓임(주문 데이터는 바뀜)
단, ERD에서는 존재/ 행위 관계를 별도로 구분하지 않음
1. 관계명
> 학생 - 수업
2. 차수
> 학생과 수업이 1:1의 관계인지/ 1: 다수의 관계인지를 정의하는
3. 선택성
> 이것이 선택적인 것인지 그렇지 않은 것인지의 차이
- 관계가 어떤식으로 정의되는 것인지를 의미함
1. 1대1관계
1.1) 완전 1대1의 관계
- 하나의 엔터티에 관계되는 엔터티가 반드시 하나로 존재하는 경우
1.2) 선택적 1대1의 관계
- 하나의 엔터티에 관계되는 엔터티가 하나이거나 없을 수도 있는 경우
2. 1:다의 관계
> 예) 사원이 부서 코드를 바라볼수도 있지만
부서 코드가 사원을(다수로) 바라볼 수도 있음
3. 다:다의 관계
- 두개의 테이블을 조인할 때 [카테시안 곱이 발생]하기 때문에 조인의 성능이 좋지 않음
> 따라서 다대다의 관계는 해소해주는게 중요함
*카테시안 곱 : 조인했을 경우, 모든 데이터가 다 추출되는 것
- 엔터티안에 행(인스턴스)의 관계에 초점을 맞춘 것
*관계 & 차수 & 페어링의 차이
- [관계] 학생과 강의 엔터티는 : 관계를 가짐
- [차수] 학생 : 여러 강의 수강할 수 있음/ 강의도 여러 학생의 관계 : 다대다
> 즉, 하나의 엔터티와 다른 엔터티 간의 레코드 연결 방식
- [페어링] 학생A가 강의B를 23년 1학기에 수강했고 성적은 A를 받았다
> 즉, 두 엔터티 간의 특정 연결 설명과 추가 정보를 제공하는 용도
- 엔터티를 대표할 수 있는 속성
- 인스턴스를 구분하는 구분자
- *식별자 : 논리 모델링에서 사용 = 키 : 물리 모델링
- 유일성 : 유일해야함
- 최소성 : 최소의 속성으로 구성
- 불변성 : 고유값으로 항상 존재해야함
- 존재성 : 반드시 존재해야함(NULL 허용하지 않는다)
1) 대표성 여부에 따른 식별자의 종류
- 주식별자
: 유일성과 최소성 만족하며 엔터티를 대표
: 인스턴스를 유일하게 구분
: 타 엔터티와 참조관계를 연결할 수 있는 식별자
- 보조식별자 :
: 엔터티 내에서 각 인스턴스를 구분할 수 있는 구분자이지만, 대표성 가지지 못함
: 유일성과 최소성 만족하지만, 대표성을 가지지 못하는
: 예) 주민등록번호 - 식별자이지만, 보안 등의 이수로 조회시 사용 불가
2) 생성 여부에 따른 식별자의 종류
- 내부식별자
: 다른 엔터티 참조 없이 엔터티 내부에서 스스로 생성되는 식별자
- 외부 식별자
: 다른 엔터티와 관계로 인하여 만들어지는 식별자(외래키)
: 예) 우편번호 - 주소에 대한 정보 기반으로 우편번호 연결되기 때문
3) 속성 수에 따른 식별자 종류
- 단일 식별자 : 하나의 속성으로 구성
- 복합 식별자 : 2개 이상의 속성으로 구성
4) 대체 여부에 따른 식별자 종류
- 본질 식별자 : 비즈니스 프로세스에서 만들어지는 식별자
> 부서코드 : 부서식별에 필요하여 만들어짐
- 인조식별자 : 인위적으로 만들어지는 식별자/ 자동으로 증가하는 일련번호
> 주문번호 : 주문일자 + 주문순서+상품코드 대산 만든 인조식별자
IE : 주 식별자는 가장 상단에
Barker : 주식별자는 #으로 표기
1. 자주 이용되는 속성을 주식별자로 지정하기
2. 명칭/ 내역 자체는 피하기 (예, 부서명보다는 부서코드를)
3. 속성의 수는 최소로 하기
1. 강한 개체 : 독립적으로 존재 가능한 것
2. 약한 개체 : 독립적으로 존재 불가능한 것
> 고객 - 계좌 : 고객이 있어야 계좌가 존재하기 때문에 고객이 강한 개체
1. 식별 관계
- 하나의 엔터티의 기본키를 / 다른 엔터티가 기본키의 하나로 공유
- ERD에서 실선 표기
2. 비식별 관계
- 강한 개체의 기본키를 다른 엔터티의 기본키가 아닌 일반 속성으로 관계를 가지는 것
- ERD : 점선으로 표기
- 엔터티를 분해하는 과정/ 테이블을 분해하는
- *분해하는 이유 : 엔터티의 정의를 내리기 위함(학생정보를 어디까지 볼것인지 정하는 것)
> 일관성, 최소성, 유연성을 가지기 위함
> 중복 제거, 데이터 모델의 독립성 확보
> 데이터 이상현상을 줄이기 위한 데이터 베이스 설계 기법
- 엔터티를 상세화 하는 과정(논리 데이터 모델링 수행 시점에서 고려됨)
- 제1~5정규화까지 존재(하지만, 보통 3정규화까지만 함)
- 정규화를 하지 않아서 발생하는 모든 현상을 지칭
> 너무 많은 정보를 엔터티에 담아버리지 말기
*1, 2, 3정규화는 예제까지 확실히 알기/ 4, 5는 개념만 이해하기
1. 제 1정규화 (1NF)
- 테이블에 컬럼이 원자성을 가지도록 분해하는 것
- 하나의 행과 컬럼의 값이 하나만!
2. 제 2정규화(2NF)
- 제 1정규화 진행한 테이블 & 완전 함수 종속을 가지도록함
**완전 함수 종속 : PK가 2개라면, 2개가 온전한 영향을 주는 것들만 하나의 테이블에
> 학생번호/ 강의명/ 강의실/ 성적 : 하나의 테이블
> BUT, 강의실 : 강의명에 따라 달라짐(==부분 함수 종속)
> 참고) 성적 : 학생번호 & 강의명에 따라 달라짐 (== 완전 함수 종속)
3. 제 3정규화(3NF)
- 제 2정규화에서 이행적 종속 없애기
- **이행적 종속 : A-> B, B->C, A->C
> (A, B), (B,C)로 분리 필요함
>예) 계좌번호/ 예수금/ 관리점코드/ 관리점
> 계좌 : 계좌번호/ 예수금/ 관리점 코드(A, B)
> 관리점 : 관리점 코드/ 관리점(B,C)
4. 제 4정규화
- 여러 컬럼들이 하나의 컬럼을 종속시키는 경우 분해하여 다중값 중속성을 제거
5. 제 5정규화
- 조인에 의해서 종석성이 발생되는 경우 분해
- 정규화해서 조깨다보니까 생기는 문제도 있음 (조인을 해서 데이터 추출하는 경우 성능 떨어짐)
- 데이터베이스의 성능 향상을 위해 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능향상 방법
- 시스템의 성능 향상, 개발 및 운영의 단순화를 위해 정규화된 데이터 모델을 중복, 통합, 분리하는 기법
- 조회(SELECT) 속도를 향상시키지만, 데이터 모델의 유연성은 낮아짐
*비정규화는 정규화를 수행하지 않음을 의미
반정규화 수행 케이스
- 정규화에 충실하여 종속성, 활용성은 향상되지만 수행 속도가 느려지는 경우
- 다량의 범위를 자주 처리해아하는 경우
- 특정 범위의 데이터만 자주 처리하는 경우
- 요약/집계 정보가 자주 요구되는 경우
- 부모 식별자와 자식 식별자에 상속하는 것
- 상속된 속성을 매핑키(조인키)로 활용
1. 존재적 관계 : 존재의 영향을 주는 것
2. 행위적 관계 : 행위적인 것에 생성되는 것(=고객 주문)
- 정규화를 통해서 분리를 했지만, 업무적으로 다시 합쳐서 봐야하는(출력) 경우
- 인스턴스 안에 속성값에서 동일한 값이 있는 것(셀프 조인이 필요함)
> 예) 사원 1 : 상위 관리자 사원 10
사원 10 : 상위 관리자 사원 20
>> 사원 10 : 겹쳐짐
- 두 테이블 중 하나만 가능한 관계
>> 개인 고객 - 고객번호를
법인 고객 - 법인번호를
>> 단, 두개 동시 입력 불가능
- 하나의 연속적인 업무를 의미함
- 필수적인 관계 형태를 가짐
> 예) 계좌이체를 할 경우. 계좌 잔액 확인 - 계좌 이체 실행 - 본 계좌에서 잔액 마이너스 처리 (*연속적)
트랙젝션의 주의 사항
- 서로 독립적으로 발생하면 안됨
>> 부문 커밋하면 안되고, 동시에 커밋 / 롤백해야함
1) IE표기법 : 원을 사용
- 필수적 관계 - 원없음
- 선택적 관계 - 관계선 끝에 원을 그림
2) 바커표기법 : 실/점선 사용
- 필수적 관계 - 실선
- 선택적 관계 - 점선
- 아직 정해지지 않은 값
- 0 아님!!!
- 컬럼별로 허용할지 말지도 정해야함
NULL의 특징
1. NULL을 포함한 연산 결과는 항상 NULL!
>> 따라서, 연산을 할때 NULL의 값은 치환해서 사용하기
> NUL:L = 0으로 치환하기
2. 집계함수는 NULL을 제외한 연산 결과 리턴
- sum, avg, min, max 등의 함수는 null을 무시하고 연산함
- 숫자를 셀때도 빼고함
- *count* : null도 세줌
- IE : null 허용 여부를 알 수 없음
- 바커 : 속성 앞에 동기라미 표현을 함 (동그라미 있으면 null 허용속성)
참고자료1) 홍샘의 데이터랩 / 유튜브채널/ 강의 https://www.youtube.com/watch?v=QB_GYdHUHmA