Sad Puppy 3 개발자 아지트 :: 개발자 아지트

[식별자(Identifiers)란?]

엔티티 내 유일하게 인스턴스를 식별할 수 있는 속성의 집합

식별자 = primary key


식별자 분류 (*식별자의 종류는 다양하게 존재한다. )

 

1. 대표성여부: 주식별자(직원ID) vs 보조식별자(주민등록번호)

2. 스스로생성여부(자생여부) : 내부식별자 vs 외부식별자 (엔터티안에있는 식별자인지 아니면 외부에서 가져온 것인지(FK=외래키)

3. 단일속성여부 : 단일식별자 vs 복합식별자 (식별자가 1개냐? 그 이상이냐?- 그림 속 직원 연락처 테이블은 식별자 2개를 조합했음)

4. 대체여부 : 본질식별자 vs 인조식별자
(본질식별자: 부서명, 인조식별자: 부서명이 너무 길 경우 D002 이런식으로 코드 따자~(사람들이 편의를 위해서 임의로 코드같은 걸 만든 것임))

 

본질식별자: 업무에 의해 생성된 식별자     

인조식별자: 편의를 위해 인위로 만든 식별자     

NULL이란?

:아직 정해지지 않은 값을 의미한다. 

 

Q. 다음 중 고객ID가 C0006인 고객의 이름과 휴대폰번호는?

(1) 아직 어떤 값이 들어오지 않았음을 표현할 수 있다. 

 

(2) 테이블(=엔터티)의 특성상 행 X 열 형태의 유지를 해야한다. 

 

 

트랜잭션이란?

:데이터베이스의 논리적인 연산 단위 혹은 논리적인 업무단위

 

ex) 강태우(A계좌)가 김영희(B계좌)에게 1,000,000원을 송금하려고 한다.  어떤 일련 과정을 거쳐 송금 업무가 이뤄지는지 생각해보자.

 

ex) 누군가 요구사항을 이렇게 작성함

: 저희 쇼핑몰은 고객이 주문을 하면 주문 정보를 저장합니다. 하나의 주문정보에는 여러 상품이 있어서 주문상세정보로 저장을 합니다. 

 


식별관계 vs 비식별관계

 

식별자관계: 외래키(빌려온 키)가 PK(식별자)의 일부분인가?

비식별자관계: 외래키(빌려온 키)가 PK(식별자)의 일부분이 아닌가?

 

 

[조인이란?] == SQL의 꽃

: 식별자를 상속하고 이를 이용해서 데이터를 결합 한 것을 통해 여러 엔티티에서 필요한 데이터를 한번에 가져오는 것

 

Q. 회원ID 가 'A001' 인 회원의 이름과 휴대폰 번호는 뭘까?

 

조인을 사용하지 않는 경우
조인을 사용하는 경우


계층형 데이터 모델이란?

: 계층구조를 가진 데이터를 저장한 모델인 자기 자신의 엔터티와 관계가 발생하는 경우

하나의 사수 ID가 여러 직원을 가지는 경우

 

ERD그리는 순서 잘 보기

 

특수한 관계를 조회하는 계층 쿼리


상호배타적 관계란?

: A와 B가 C집단에 소속되었지만, 서로 공통적인 부분이 없는 관계

빨간 표시는 상호 배타적 관계를 표시함 (기호 잘 보기)

 

대출 번호는 PK

 

 

 

개정된 시험에서는 설계도 그림을 보고 정규화 상태인지 조인의 상태인지를 구분하는 것을 중요하게 봄

01. 정규화

: 데이터에 대한 중복을 제거하고 데이터가 관심사별로 처리되도록 엔터티를 쪼개 성능을 향상(조회/입력/수정/삭제 등)을 시키는 활동

단, 정규화가 대체로 좋은 것이며, 경우에 따라서는 반정규화(정규화의 반대)가 더 이득일 수도 있음

 

(반정규화: 중복을 포함하려고하고 엔터티를 합치는 과정임)

 

대부분 정규화를 거의하고, 특수한 사례에 대해서 반정규화를 진행함 

중복을 막기위헤 두번 입력된 데이터에 대해서 엔터티를 뜯었음

 

정규화시 입력/삭제/수정(DML)은 (무조건)성능 향상! 조회는 성능 향상 속은 저하 될 수 있음 


함수적 종속이란? F(X) = Y

: 정규화를 하기 위해 알아야 하는 개념으로 어떤 기준 값(컬럼(=속성))에 의해 데이터가 종속되는 현상을 의미함

 

만약 X가 Emp001이면 Y는 아이디 Emp001에 종속되는 유일한 인스턴스가 나옴

X: 결정자

Y: 종속자 

ex) 결정자(아이디) -> 종속자(이름, 나이, 연봉, 부서ID, 부서명) : 아이디가 나머지 모든 컬럼을 함수종속한다. 

ex) 결정자(부서ID) -> 종속자(부서명) : 부서ID가 부서명 컬럼을 함수종속한다. 


정규화 과정 상세히 알아보기 (시험에 잘 나옴)

대상의 형으로 가기까지 중간에 순서를 건너뛸 수 없음

 

비정규형: 데이터가 중복이 되어있어서 정규화가 필요한 상태 

도메인 원자성: 1차 정규화

1NF: 1차 정규화(도메인워자성 충족)를 통해 1차 정규형을 만들 수 있음 

 


정규화(1차 정규화)

: 엔터티에서 다중 속성이 있거나 하나의 속성에 여러 속성값이 있으면 원자값(1개)으로 쪼개준다. 

= 원자성을 확보하기 위한 활동

= 하나의 속성에 하나의 값을 가질 수 있도록 쪼개줌 

비정규형 ->(1차 정규화) 1차 정규형

 

정규화의 대상 (위)

 


정규화(2차 정규화)

: [1정규형 -> 2정규형(NF)] 형태로 엔터티를 변경하는 활동이다. 

식별자에 부분 종속 하는 대상을 쪼개어 준다.

즉, 결정자 전부에 나머지 컬럼이 완전 종속하지 않고, 결정자 부분적으로도 종속한다면 쪼개야 한다.

 

*2차 정규화 푸는 팁*

1. 위에서 부분적 종속한다고 하는 것들을 따로 뜯어낸다. (결정자는 주식별자로)

 

2. 기존의 엔터티에서 학번이 가져간 일반속성을 제외하고 입력한다. 

 

3. 기존의 데이터를 파악하여 관계를 설정한다. 

 


정규화(3차 정규화) : 이행종속제거

엔터티에서 일반속성끼리 함수종속이 발생하면 쪼개준다. 

 

이행종속:

직원 ID를 통해 부서 ID를 식별할 수 있고, 부서 ID를 통해 부서명을 식별할 수 있으면 이행종속이라고 함. 

 

결정자(직원ID) -> 종속자(나머지 컬럼들) //완전함수종속! 2NF 만족

 

그런데 나머지 일반 컬럼중에서 결정자(부서ID) -> 종속자(부서명) 이 발생했음

이걸 쪼개줘야 함. 방법은 2차 정규화에서 했던 방식처럼 동일


반정규화(=역정규화)도 알아보자 (현재 시험 범위에서는 빠진것)

: 정규화한 데이터를 다시 합쳐서 중복되게 하거나 통합, 분리 등을 수행하는 모델링 방식

 

1. 테이블 반정규화 (테이블 병합, 테이블 분할, 테이블 추가 등)

2. 컬럼 반정규화 (중복컬럼, 파생컬럼, 이력테이블 컬럼 추가 등)

3. 관계 반정규화 (중복관계 추가)

 

정규화 vs 반정규화? = 성능 향상을 위해 진행함(조회를 할 경우 대부분 정규화 한 상태가 좋지만, 반정규화 상태에서도 좋을 수도 있음)

비정규화 상태 -> 정규화한 정규형 상태

 

입력, 수정, 삭제시 정규화한 상태가 무조건 좋음


반정규화 대상 조사 방법(실무에서는 반정규화를 거의 안함)

 

(반정규화는 데이터의 무결성을 깰 위험이 있다. 그래서 가급적 다른 방법을 생각해보고 안되겠다 싶을때 한다. )

1. 반정규화가 필요한 대상을 찾아본다. 

2. 다른 방법이 없는지 검토해본다. 

3. 달리 방법이 없다면 반정규화를 적용한다.

  • 1. 테이블 반정규화 (테이블 병합, 테이블 분할, 테이블 추가 등)
  • 2. 컬럼 반정규화 (중복컬럼, 파생컬럼, 이력테이블 컬럼 추가 등)
  • 3. 관계 반정규화 (중복관계 추가)

컬럼 반정규화

* 종류가 많으므로 대표적인 예시만 몇 개 소개한다. 

 

(1) 중복컬럼 추가 

  • 테이블에 중복되는 컬럼을 추가해 조인을 감소시킨다. 

 

두 엔티티 중에서 일부만 수정할 경우 데이터의 무결성이 깨질 위험이 있음, 따라서 반정규화는 거의 하지 않음

 

https://www.acmicpc.net/problem/12933

 

문제설명

문제 해결 방법

1. quack이 끝나기전에 q가 나오면 다른 오리가 하나 더 있는 것으로 침 

2. 리스트에 오리가 발견될 때마다 0의 값을 추가해줌

3. quack을 문자마다 0, 1, 2, 3, 4로 표기함.  즉, 오리가 quack을 완성할수록 하나의 인덱스의 값은 0에서 4까지 1씩 증가함

4. 리스트에서 제일먼저 k까지 울은 오리의 index를 따로 다른 리스트를 만들어서 오리를 순서대로 줄세워둠 

5. 최근에 k까지 울은 오리를 먼저 뽑아서 (스택 스타일) q를 먼저 줌(해당 인덱스에 0으로 갱신) = 먼저 울게 해준다.

6. 정상적으로 울지 않는 것에 대해서는 예외처리를 통해 처리하고, -1을 출력함. 

 

코드 구현

# 울음 소리를 한 번 또는 그 이상 연속해서 내는 것

# quack이 끝나기전에 q가 나오면 다른 마리인 것.
# quack이 완벽하게 끝나고 또 quack이 완벽하게 끝나면 한마리로 침

tmp = []

s = input()

waitList=[]

check = 0

for i in s:
    if i == 'q':
        if waitList:
            where = waitList.pop()
            tmp[where] = 0
        else:
            tmp.append(0)
    elif i == 'u':
        try: 
            where = tmp.index(0)
        except ValueError: 
            check = 1
            break
        tmp[where]+=1
    elif i == 'a':
        try: 
            where = tmp.index(1)
        except ValueError: 
            check = 1
            break
        tmp[where]+=1
    elif i == 'c':
        try: 
            where = tmp.index(2)
        except ValueError: 
            check = 1
            break
        tmp[where]+=1
    elif i == 'k':
        try: 
            where = tmp.index(3)
        except ValueError: 
            check = 1
            break
        tmp[where]+=1
        waitList.append(where)
result = 0
if check ==1:
    print(-1)
else:
    for i in tmp:
        if i == 4:
            result +=1  
        else:
            print(-1)
            check = 1
            break
if check !=1:
    print(result)

 

시간/공간 복잡도

O(N)

 

 

최적화 및 개선

따로 하지 않음.

 

어려웠던 점

리스트에서 특정 값을 통해 index를 구할때, index()함수만 쓸 줄 알았다. 그리고 그 함수가 찾고자 하는 값을 못찾을때 -1을 반환하기 보다는 ValueError를 발생시킬줄 몰랐다. 찾아보니 find()함수가 문자열에서 찾고자 하는 값을 못찾을때 -1을 반환했다. 

 

하지만 find()함수를 사용하지 않았다. quack 우는 것을 숫자로 표기해서 문제푸는게 넘 편한데 다시 문자열로 변환할 필요를 못느꼈다. 

 

처음에 문제의 감을 못잡아서 문자열 앞에서부터 quack을 지워갈 생각을 했다. ㅎ; 

 

코딩테스트 문제 풀면서 예외처리문을 처음 사용해본것 같다. 사용법에 대해서 잘 숙지하고 있어야겠다. 

 

코드에 중복되는 부분이 많아서 함수로 표현을 하면 좋을것 같았다. 함수로 코드를 짜버릇 해야겠다. 

[시험 구성]

 

1과목 : 10문제 (실무에서도 중요함, 암튼 중요함, 이론+ 암기성향이 강함= <이해>)

2과목 : 40문제 

 

[과락 기준]

 

과락 => 과목당 40% 이상

== 1과목 최소 4문제는 맞아야함.

 

[과목별 주제]

 

1과목 주제: 데이터 모델링의 이해

1. 엔터티(ENTITY) 이해하기

2. 속성

3. 관계

4. 식별자

5. 데이터 모델의 이해 

 

2과목 주제: 데이터 모델과 SQL

1. 정규화

2. 관계와 조인의 이해

3. 모델이 표현하는 트랜잭션의 이해

4. Null 속성의 이해

5. 본질식별자 vs 인조식별자 

 

[필요 공부량]

강의 2~3번 정독을 요함(?)

 

[관계(Relationship) 이해하기]

엔터티 내의 인스턴스들 간에 서로 논리적인 연관성이 있는 상태 

ex=> 직원은 부서에 소속되고, 부서는 직원을 소유함

 

지금 사용하는 데이터베이스는 대부분 관계형 데이터베이스임.

 

엔터티끼리의 관계를 통해 데이터의 의미를 설정.

 

엔터티 간에 같은 속성으로 인해 연결이 가능하면 관계임

 

 

관계의 분류  - 존재/행위 (시험 목적으로만 이해하면 됨)

 

존재에 의한 관계  직원 - 부서 (소속되다/보유하다)

행위에 의한 관계  고객 - 상품 (주문하다/주문되다)

 

<아래의 내용만 간단하게 암기 >

-ERD는 존재/행위 등 관계를 위처럼 똑같이 표시한다. 

-UML 클래스다이어그램은 

:연관관계(존재)는 실선으로 표기하고

의존관계(행위)는 점선으로 표시한다. 

 

다음중 관계의 분류에 대해 올바르지 않는 것은?

erd는 존재의 경우 점선으로 한다.. 이정도만 나옴

 


관계를 표시하는 방법 

 

SQLD는 uml은 안나오고, erd는 나옴. IE가 시험에 대부분 나옴 Borker는 시험에 안나오지만 둘의 차이점은 시험에 나옴

 

관계명(Membership)

 

관계차수(Cardinality/Degree)

 

 

까치발은 하나의 부서는 여러 직원을 포함하고 있다는 의미임

 

 

관계선택사양(Optionality)

 

 

 

중간에 놓침

 

코드성, 통계성이란? 

 

코드성: 값을 코드형식으로 저장 => 오히려 복잡해질 수 있어서 관계를 이어주지 않음

통계성: 월별로 매출액 저장

 

 

네가지 사지선다로 나옴. (말장난) 노란거만 외우면됨

 


[04. 식별자] [05. 데이터 모델 이해하기]

 

데이터 모델링이란?

 

 

개발 순서 : 기획(요구사항)->설계->개발->테스트->운영이라는 환경에 올림

 

모델링은 설계단계임

그러나 모델링 결과물은 개발 순서 전반에 걸쳐서 다씀. 

 

 

개발자는 현업 관련 지식을 잘 모름. 

그냥 업무 중심적으로만 알뿐,

 

전사적: 기업 입장에서 본다. 

DBMS 독립적: 데이터베이스를 쉽게 쓸 수 있게 하는 관리 시스템과 독립적으로 저 그림을 가지고 있으면 어떻게든 쓸 수 있음

 

 

릴레이션과 릴레이션쉽은 다르다!!!!!!!!

 

관계를 그림으로 표현한 것을 ERD라고 함.

 

그리는 순서도 시험에 나왔음

 

 

 

 

선택 참여는 없을 수도 있음

 

 


[논리적 데이터 모델링]

 

 

오라클에서 만든건 오라클에서만 쓸 수 있다. 

논리적 데이터 모델링을 할 때 정규화를 수행한다. 

 

그리는 방법!!

 

 

식별자-> 인스턴스를 유일하게 구분할 수 있는 속성의 집합 

 

 

분석 -> 설계 -> 개발 -> 테스트 -> 운영 

 

에서 설계가 진짜 중요함

 

 

 

 

 

 


[데이터베이스 3단계 구조]

 

'시험 관점에서 종류와 특징만 암기하면 된다. '

     v 종류                            v 특징
(1)외부(External) 스키마: 여러 사용자 각각의 관점

(2)개념(Conceptual) 스키마: (여러사용자의 전체적인 관점)통합적, 조직 전체의 DB관점

(3)내부(Internal)스키마: 데이터 물리 저장 구조 표현

 

*각 스키마는 독립성을 가짐(뒷장 예시)

 

 

  • A, B, C가 보는 관점에 따라 다름 = 외부 스키마
  • 외부 스키마와 개념 스키마의 독립성
    • 개념 스키마가 바뀌어도 외부 스키마에서는 확인이 어려운 것을 의미함. 

 


[식별자(Identifiers)란?]

엔티티 내 유일하게 인스턴스를 식별할 수 있는 속성의 집합

식별자 = primary key


식별자 분류 (*식별자의 종류는 다양하게 존재한다. )

1. 대표성여부: 주식별자(직원ID) vs 보조식별자(주민등록번호)

2. 스스로생성여부(자생여부) : 내부식별자 vs 외부식별자 (엔터티안에있는 식별자인지 아니면 외부에서 가져온 것인지(FK=외래키)

3. 단일속성여부 : 단일식별자 vs 복합식별자 (식별자가 1개냐? 그 이상이냐?- 그림 속 직원 연락처 테이블은 식별자 2개를 조합했음)

4. 대체여부 : 본질식별자 vs 인조식별자
(본질식별자: 부서명, 인조식별자: 부서명이 너무 길 경우 D002 이런식으로 코드 따자~(사람들이 편의를 위해서 임의로 코드같은 걸 만든 것임))

 


주식별자 도출기준

1. 업무에서 자주 쓰는 속성일 것 (주민번호는 실무 입장에서 암호화가 되어야함=식별자로 쓰기 어려움)

2. 명칭, 이름 등은 피할 것 (중복이 될 수 있음)

3. 속성의 수가 많지 않을 것 (속성이 최소의 개수로 이루어져야함)

 

주식별자 특징

 

1. 유일성: 인스턴스를 유일하게 식별하기

2. 최소성: 속성의 수가 많지 않기

3. 불변성: 가급적 변하지 않기 (실무에서 변할수는 있으나, 그럴일은 없음)

4. 존재성: 값이 꼭 입력되기

 

 

 

저 까만 통은 하드디스크임 

 

 

 

데이터 모델

: 현실세계의 대상을 추상화, 단순화, 명확화 하여 데이터베이스로 표현하는 것. 

 

 

 

<데이터 모델링>

만들고 싶다.=> 단순 설계도 그리자=> 좀 더 상세한 설계도 그리자=> 실제 구축해보자 => 만들었다. 

 

요구 사항 접수 => 념적 데이터 모델링 => 리적 데이터 모델링 => 릴적 데이터 모델링 => 데이터페이스에 저장할 수 있게 세팅 

 

개념적 데이터 모델링 : 그림으로 표현(엔티티, 관계, 속성 등이 이 안에 들어가있음)


[엔티티 이해하기]

 

엔티티(ENTITY, 개체)란?

: 업무에 필요한 정보를 저장/관리하기 위한 집합적인 명사 개념

ex)

직원 관리 프로그램 만들자=>직원 정보 필요. 하나의 집합으로 표현하면(단순화/추상화/명확화)  엔티티 => "직원" 이 됨.

 

인스턴스(INSTANCE)란?

: 엔터티 집합 내에 존재하는 개별적인 대상 

ex)

직원이라는 엔티티 안에 있는 직원 A= 인스턴스

직원이라는 엔티티 안에 있는 직원 B= 인스턴스

 

엔터티의 특징

 

1. 반드시 업무에서 필요한 대상이고 업무에 사용될 것

2. 유일한 식별자로 식별이 가능할 것

3. 인스턴스가 2개 이상일 것(데이터가 두개 이상)

4. 속성이 반드시 2개 이상 존재할 것

5. 관계가 하나 이상 존재할 것 (단 코드성, 통계성은 생략 가능)

 

엔터티의 분류(유무형에 따라 분류) - bold체 모두 암기해야함 

 

시험에서는 이런 종류가 있다 정도로만 물어볼 것임

 

유형 엔터티: 물리적 형태가 있는 엔터티 ex) 직원, 주류, 강사, 고객

개념 엔터티: 물리적 형태가 없는 엔터티 ex) 부서, 과목, 계급

사건 엔터티: 업무 수행 중에 (제일 많이 발생) 발생하는 엔터티 ex) 직원, 강의, 매출, 주문, 상담

 

 

엔터티의 분류(발생시점에 따라 분류) - bold체 모두 암기해야함 

 

기본/키 엔터티: 본래 업무에 존재하는 정보 독립 생성 가능, 주식별자 보유 ex) 직원, 고객, 상품, 부서 

중심 엔터티: 기본 엔터티로부터 발생, 업무에 있어 중심 역할 ex) 주문, 매출, 계약, 대출 

행위 엔터티: 2개 이상 엔터티로부터 발생 ex) 주문이력

 

엔터티의 명명(naming) 규칙

1. 가능한 협업 용어를 쓴다. ex) 사람-> 고객, 전봇대 -> 전주

2. 가능하면 약어를 사용하지 않는다. ex) 일별매출정보-> 일매목 xxxxx

3. 단수 명사를 사용한다. 

4. 엔터티 이름은 유일해야 한다. 

5. 엔터티 생성 의미대로 이름을 부여한다. ex)연락처목록 -> 직원연락처목록? 고객연락처목록? (구체적으로 작성해라)

 


[속성(ATTRIBUTE) 이해하기]

 

: 업무상 관리하기 위해 의미적으로는 더는 분리되지 않는 최소의 데이터 단위,

엔터티가 가지는 공통적인 특징을 표현함 

우리가 관리하고자 하는 정보가 됨.

 

엔터티, 인스턴스, 속성의 관계

1. 하나의 엔터티는 2개 이상의 인스턴스를 가진다. 

2. 하나의 엔터티는 2개 이상의 속성을 가진다. (아니면 데이터베이스 쓰는 의미 없음)

3. 속성은 각 인스턴스를 설명해줄 수 있다. 

4. 하나의 속성에는 하나의 속성값만 들어간다. 

 

가로한줄이 인스턴스임.

 

식별자란?

:엔터티 내 유일한 인스턴스를 식별할 수 있는 속성의 집합 ex)직원 id

 

 

속성의 분류(특성에 따른 분류)

 

기본: 업무로부터 추출한 속성으로 제일 많이 발생/ 이름, 주민번호, 직원 ID, 나이, 연봉, 부서명 등

설계: 설계시 규칙화 등이 필요해 만든 속성/ 코드성이나 일련번호, 부서코드 등

파생: 다른 속성들로부터 계산/변형되어 만들어진 속성 / 부서별 연봉합 등 (실무에서 지양함- 데이터 추가될때마다 관리 힘듦) 

 

속성의 분류 ( 구성방식에 따른 분류)

-PK(식별자), FK, 일반속성, 복합속성 

 

속성 명명(Naming) 규칙

1. 가능한 현업 용어를 쓴다. 

2. 가능하면 약어를 사용하지 않는다. 

3. 명사형을 쓰고 서술식이나 수식어 등을 제한한다. ex)오늘 배송된 상품 -> 일배송 상품

4. 가능한 속성 이름은 전체 데이터 모델에서 유일해야 한다. (실무에서 그렇게 지키는거 같진 않...)

 

도메인(DOMAIN) 이란?

: 각 속성이 입력 받을 수 있는 값의 정의 및 범위를 의미함

: 보통 테이블을 만들 떄 각 속성마다 자료형 및 제약조건을 줄 때 결정된다. 

 

ex) 나이는 숫자만 입력받을 수 있고, 0~999까지 입력받는다. 

 


 

 

 

 

 

 

 

erd란?

: 개체-관계 다이어그램

엔티티, 속성, 관계를 시각적으로 표현하는 방법이다. 

 

엔티티: 현실 세계에서 독립적으로 존재하는 객체, 데이터베이스에서는 테이블로 표현됨

속성: 엔티티의 특성이나 데이터를 나타내며, 엔티티를 설명하고 식별하는데 사용됨

관계; 엔티티 간의 연결을 나타내며, 데이터의 흐름을 정의함 

 

제 1정규화 : 하나의 속성이 하나의 값을 가져야함. (각 테이블의 모든 열이 원자 값을 가짐)

제 2정규화: 기본 키가 아닌 열이 기본 키의 모든 부분에 전적으로 종속하도록 한다. 

제 3정규화: 기본 키에만 의존하지 않는 불필요한 데이터를 제거한다. 

더보기

제 3정규화: 기본 키에만 의존하지 않는 불필요한 데이터를 제거한다. 

기본 키에만 의존하지 않는 불필요한 데이터를 제거한다는 말은 데이터베이스에서 부분 함수 종속과 관련된 문제를 해결하는 것을 의미해. 이것은 데이터를 저장할 때 정보가 중복되지 않도록 테이블을 잘 설계하는 방법 중 하나야. 쉽게 말해서, 데이터를 효율적으로 정리하는 방법이라고 생각하면 돼.

  • 기본 키(Primary Key): 데이터베이스에서 각 줄(row)을 고유하게 식별하는 값이야. 예를 들어, 학생 명단에서는 학생마다 고유한 학생 번호가 기본 키가 될 수 있어. 학생 번호가 같으면 같은 학생이라고 보면 돼.
  • 부분 함수 종속: 테이블의 어떤 칼럼(열)의 값이 기본 키의 일부분에 의해서만 결정되는 상황을 말해. 예를 들어, "수업" 테이블이 있다고 해보자. 여기에는 학생 번호, 수업 코드, 학생 이름, 수업 이름 같은 칼럼이 있어.

문제 상황:

  1. 만약 학생 번호와 수업 코드를 합쳐서 기본 키로 삼는다면, 각 줄은 한 학생이 특정 수업을 듣고 있다는 것을 나타내.
  2. 여기서 학생 이름은 학생 번호에만 의존하고, 수업 이름은 수업 코드에만 의존해.
  3. 이런 상황에서 한 학생이 여러 수업을 들으면 학생 이름이 여러 줄에 반복돼서 저장될 수 있어. 마찬가지로 여러 학생이 같은 수업을 들으면 수업 이름도 반복돼서 저장돼.

해결 방법:

이런 불필요한 중복을 피하기 위해 테이블을 나누는 거야:

  • 학생 테이블: 학생 번호, 학생 이름
  • 수업 테이블: 수업 코드, 수업 이름
  • 수강 테이블: 학생 번호, 수업 코드

이렇게 테이블을 나누면, 각 테이블의 정보가 기본 키에만 의존하게 돼. 따라서 데이터의 중복을 줄이고, 정보가 변경될 때 모든 관련 데이터를 일일이 수정하지 않아도 돼.

이것이 바로 기본 키에만 의존하지 않는 불필요한 데이터를 제거하는 이유야. 이렇게 하면 데이터베이스가 더 효율적으로 관리되고, 오류도 줄일 수 있어.

BCNF: BCNF는 3NF에서 더 나아가 모든 결정자가 후보키가 되도록 한다. 

 

더보기
 

BCNF(Boyce-Codd Normal Form)라는 것은 데이터베이스 테이블을 아주 잘 정리된 상태로 만드는 기준 중 하나야. 

기본 개념들

  • 기본 키(Primary Key): 각 줄(row)을 고유하게 구분할 수 있는 값이야. 학생 명단에서는 학생 번호가 기본 키가 될 수 있어.
  • 후보 키(Candidate Key): 기본 키로 쓸 수 있는 모든 키들을 말해. 기본 키도 후보 키 중 하나야. 예를 들어, 학생 테이블에서는 학생 번호가 유일하다면, 학생 번호가 후보 키야.
  • 결정자(Determinant): 어떤 칼럼의 값이 다른 칼럼의 값을 결정한다면, 이때 앞의 칼럼을 결정자라고 해. 예를 들어, 학생 번호가 있으면 그 학생의 이름을 알 수 있다면, 학생 번호가 학생 이름의 결정자야.

3NF(제3정규형)

3NF는 데이터를 중복 없이 잘 정리하는 기준 중 하나야. 이 기준에 맞으려면 모든 비기본 속성이 기본 키에만 의존해야 해. 예를 들어, 학생 테이블에서 '학생 번호'로 학생 이름과 학년을 알 수 있다면, 그건 3NF야.

BCNF(보이스-코드 정규형)

BCNF는 3NF보다 조금 더 철저한 기준이야. 이 기준에 따르면, 테이블의 모든 결정자는 후보 키여야 해. 즉, 모든 속성을 결정하는 값은 반드시 후보 키여야 한다는 뜻이야.

예시로 이해하기

문제 상황

학생이 듣는 수업을 기록한 테이블을 생각해 보자.

학생 번호수업 코드강의실
1 MATH101 101A
2 SCI102 102B
1 SCI102 102B
  • 여기서 '수업 코드'가 '강의실'을 결정한다고 해보자. 그러니까 'MATH101'은 항상 '101A' 강의실에서 열려.

BCNF가 아닌 이유

이 테이블은 BCNF가 아니야. 왜냐하면 '수업 코드'가 '강의실'을 결정하는데, '수업 코드' 자체는 후보 키가 아니거든. 후보 키는 '학생 번호 + 수업 코드'가 돼야 해.

BCNF로 만들기

테이블을 다음과 같이 나누면 돼:

  1. 수업 테이블 (수업 정보만 따로 분리)수업 코드강의실
    MATH101 101A
    SCI102 102B
  2. 학생 수강 테이블 (학생과 수업 정보만 남김)학생 번호수업 코드
    1 MATH101
    2 SCI102
    1 SCI102

이렇게 나누면, 모든 결정자가 후보 키가 돼서 BCNF를 만족하게 돼!

요약

  • 3NF: 기본 키에만 의존하도록 중복을 제거하는 기준.
  • BCNF: 모든 결정자가 후보 키가 되도록 더 철저하게 정리하는 기준.

이렇게 하면 데이터의 일관성을 유지하고, 오류를 줄일 수 있어. 이런 방식으로 데이터를 정리하는 것은 데이터베이스를 관리하는 중요한 방법이야!

 

제 4정규화: 다치 종속을 제거하여 중복을 줄임

더보기

4NF(제4정규형)은 데이터베이스를 정리할 때 다치 종속(Multi-Valued Dependency)을 제거하여 중복을 더 줄이는 방법이야. 

기본 개념들

  • 다치 종속(Multi-Valued Dependency): 한 속성이 여러 값과 연관될 수 있는 상황이야. 예를 들어, 학생이 여러 과목을 들을 수 있고, 또 여러 활동을 할 수 있다고 해보자. 여기서 학생은 과목과 활동에 다치 종속성을 가질 수 있어.

예시로 이해하기

문제 상황

학생의 수업과 활동을 기록한 테이블이 있다고 해보자.

학생 이름과목활동
철수 수학 축구
철수 영어 축구
철수 수학 수영
철수 영어 수영
  • 철수가 듣는 과목은 수학과 영어야.
  • 철수가 하는 활동은 축구와 수영이야.

중복 문제

이 테이블에는 중복이 많아. 철수가 수학을 듣는다는 정보와 축구를 한다는 정보가 여러 번 반복돼. 이렇게 되면 데이터가 많아지고, 수정하기도 불편해.

다치 종속 해결

4NF는 이런 중복을 없애기 위해 테이블을 나누는 방법이야.

  1. 학생과 과목 테이블 (학생이 듣는 과목만 기록)학생 이름과목
    철수 수학
    철수 영어
  2. 학생과 활동 테이블 (학생이 하는 활동만 기록)학생 이름활동
    철수 축구
    철수 수영

이렇게 나누면 철수가 듣는 과목과 하는 활동이 각각 따로 기록돼서 중복이 줄어들어!

요약

  • 다치 종속: 한 속성이 여러 값과 관련 있는 경우.
  • 4NF: 다치 종속을 제거하여 데이터의 중복을 줄이고, 관리하기 쉽게 만드는 방법.

이렇게 데이터를 정리하면 정보가 깔끔하게 저장되고, 나중에 변경하거나 확인할 때 더 편리해져!

 

제 5정규화: 더 이상 분해를 할 수 없을 때 까지 테이블을 분해한다. 

 

 

 

+ Recent posts