본문 바로가기
인천일보아카데미/- 학습일지

[학습일지]JAVA교육일지 52일차

by w1z 2022. 6. 24.

1. 정규화, Normalization

2. PL/SQL


1. 정규화, Normalization

[ 정의 ]

- 모델링 작업 > ERD > 정규화 > 안정성 높고, 작업하기 편한 ERD

- 자료의 손실이나 불필요한 정보를 없애고, 데이터의 일관성을 유지하고, 데이터 종속을 최소화하기 위해 자료구조(ERD)를 수정하는 작업

 

[ 목적 ]

  1) NULL 제거

  2) 중복값 제거

  3) 삽입, 갱신, 제거에 따른 이상 현상 제거 > 데이터 무결성 보장

 

[ 함수 종족(Functional Dependency) ] 

- 하나의 테이블내의 컬럼끼리의 관계 표현

- 정규화는 '부분 함수 종속' or '이행 함수 종속'을 모두 없애고, 모든 컬럼의 관계를 '완전 함수 종속'으로 만드는 작업

 

[ 종류 ]

- 형태: 1개 테이블 --> (정규화) --> 2개 이상의 테이블

  1) 제 1 정규화, 1NF

   - 모든 컬럼(속성)은 원자값을 가진다.

   - 여러개로 분리 가능한 값을 1개의 컬럼안에 넣지 말 것

 

  2) 제 2 정규화, 2NF

   - 기본 키가 아닌 모든 컬럼은 기본키에 완전 함수 종속이어야 한다.

   - 부분 함수 종속 컬럼 발견시, 부분 함수 종속 제거

   - 일부 컬럼이 복합키 모두에게 종속이 아니라, 복합키 일부에만 종속되는 현상

 

  3) 제 3 정규화, 3NF

   - 기본 키가 아닌 모든 컬럼은, 기본키가 아닌 다른 컬럼에 종속되면 안된다.

   - 이행 함수 종속 컬럼 발견시, 이행 함수 종속 제거

 

[ 관계형 데이터 베이스 시스템(Oracle)이 지향하는 데이터베이스 상태 ]

  1) 되도록 셀이 NULL 상태를 가지지 않는다. (NULL 상태의 셀이 많으면 좋지 않다.)
  2) 중복값을 저장하지 않는다.

      --> 동일한 성격의 데이터 1개 이상의 테이블에 저장하지 않는다.
      --> 같은 데이터를 여기저기 동시에 저장하지 않는다.

      --> 공간 낭비, 관리 불편
  3) 하나의 셀 > 반드시 원자값 저장(단일값, 분리될 수 없는 값(Scaler))

 

[ 역 정규화 ]

- 정규화된 결과를 다시 원래대로 되돌리는 작업

- 형태: 2개의 테이블 --> 1개 테이블

2. PL/SQL

[ 정의 ]

- Procedural Language Extensions to SQL
- 절차성 언어
- 흐름과 제어를 추가한다.
- ANSI-SQL 모두 지원

 

[ 프로시저, Procedure ]

- 메소드, 함수, 서브루린 등..
- 순서가 있는 코드의 집합

  1) 익명 프로시저
        - 1회용
        - 오라클에 저장 X
        
  2) 실명 프로시저
        - 반복용
        - 저장 프로시저
        - DB Object

 

[ 프로시저 블럭 구조(골격) ]

  1) DECLARE
   - 선언부
   - 프로시저에 사용할 변수, 객체 등을 선언하는 영역
   - 생략 가능
        
  2) BEGIN
   - 실행부(구현부)
   - BEGIN ~ END : 블럭 역할
   - 프로시저 구현 코드를 작성하는 영역(메소드의 BODY 역할)
   - 생략 불가능
   - 업무 관련 코드 작성: ANSI-SQL + 연산, 제어 추가(PL/SQL 구문)
   - JAVA의 try절 역할
            
  3) EXCEPTION
   - 예외 처리부
   - 예외 처리 코드를 작성하는 영역
   - 생략 가능
   - JAVA의 catch절 역할       


  4) END
   - 실행부(구현부)
   - 생략 불가능

 

[ PL/SQL 기본 작성법 ]

  1) 자료형
   - ANSI-SQL과 동일(확장)
    
  2) 변수 선언하기
   - 변수명 자료형 [NOT NULL] [DEFAULT 값];
   - NAME VARCHAR2(100) NOT NULL
   - ANSI-SQL에서 테이블의 컬럼을 선언하는 방식과 유사
   - 변수는 주로 질의의 결과(***)나 인자값을 저장하는 용도로 사용
    
  3) 대입 연산자
   - 컬럼명 = 값 ----> ANSI: UPDATE
   - 변수명 := 값 ----> PL/SQL 방식

 

[ SELECT INTO ]

- PL/SQL에서 많이 사용하는 SELECT의 결과값을 변수에 저장하는 구문이다. 

- 사용법: SELECT 컬럼명 INTO 변수명 FROM 테이블명 ~

- 사용조건(한가지라도 만족못하면 ERROR발생)

  1) 컬럼의 개수 = 변수의 개수

  2) 자료형 일치

  3) 순서 일치


MEMO>

# 정규형에서 역 정규형은 되돌리는 작업이므로, 위험요소가 크기때문에 되도록 쓰지 않도록 하자

 

# ANSI-SQL과 PL/SQL의 차이점을 솔직히 잘 구분 못했는데, 비절차성, 절차성 차이를 깨달았다.

 

# SQL을 배우면 배울수록 프로그램에서 데이터베이스는 엄청나게 중요한 역할을 하고 있다는것을 알게 되고, 이 데이터베이스를 만들 때, 구현 하는것보다 설계 단계에서의 작업이 가장 중요하다는것을 깨닫는거같다.

 

# PL/SQL에서의 SELECT절 이용시 꼭 변수명을 지정해주고 SELECT INTO절을 이용하자