정규화(Normalization)

정규화 http://mi.cau.ac.kr/teaching/lecture_db_design/W10F.pdf

정규화란 논리적 설계 단계에서 발생할 수 있는 종속으로 인한 이상(Anomaly)현상의 문제점을 해결하기 위해, 속성들 간의 종속 관계를 분석하여 여러 개의 릴레이션으로 분해하는 과정을 말한다.

정규화된 결과를 정규형(Normal Form)이라고 하며 제1정규형, 제2정규형, 제3정규형, BCNF, 제4정규형, 제5정규형 등이 있다.

정규화 과정 https://slidesplayer.org/slide/11674712/

제1정규형(1NF)

모든 도메인이 원자값(Atomic Value)만으로 구성되도록 하는 정규형. 모든 도메인이 각각의 튜플로 구성되도록 분해하는 과정.

제2정규형(2NF)

1NF를 만족한 상태에서 릴레이션을 구성하는 모든 속성이 기본키에 완전 함수 종속이 되도록 분해(부분 함수 종속을 제거)하는 과정.

제3정규형(3NF)

2NF를 만족하면서 릴레이션을 구성하는 속성들 간에 이행적 함수 종속관계(A->B->C)를 분해하여 비이행적 함수종속이 되도록 하는 과정. 각 테이블이 기본키에 완전 함수 종속 관계로 유지.

보이스-코드 정규형(BCNF : Boyce-Codd Normal Form)

3NF를 만족하면서 릴레이션에서 모든 결정자가 후보키가 되도록 하는 과정. 결정자가 후보키가 아닌 경우 분해하는 과정.

제4정규형(4NF)

릴레이션에서 다치 종속(MVD : Multivalued Dependency)관계가 성립되는 경우 분해하는 정규형. 다치 종속은 함수 종속과 달리 하나의 속성값이 대응되는 속성의 집합(여러개의 속성값)을 결정하는 종속관계를 말하며, 릴레이션의 속성이 3개 이상일때 존재한다.

제5정규형(5NF)

릴레이션에 존재하는 조인종속(Join Dependency)이 후보키를 통해서만 성립이 되도록 하는 정규형. 조인 종속은 원래의 릴레이션을 분해한 뒤 자연 조인한 결과가 원래의 릴레이션과 같은 결과가 나오는 종속성을 말한다

정규형 http://mi.cau.ac.kr/teaching/lecture_db_design/W10F.pdf

관계 데이터베이스 언어(SQL)

SQL 정의어(DDL)

CREATE : 테이블, 스키마, 도메인, 인덱스 ,뷰 등을 정의(생성)하기 위해 사용하는 명령문.

  • 학번, 성명, 학과, 학년, 학점으로 구성된 학생테이블을 만들어라.
  • 학번과 학년은 숫자형 자료이며, 나머지는 문자형이다.
  • 학번을 기본키로 지정한다.
  • 성명 속성은 공백이 있을 수 없다.
  • 학과 항목을 이용하여[수강]테이블의 학과를 참조하다록 외래키를 지정하며, 참조 테이블에서 삭제가 발생하면 NULL 값으로 하고, 수정이 발생하면 연쇄적으로 수정한다.
  • 학년의 속성값은 4이하의 값을 갖도록 ‘hak’ 이름으로 제약한다.
CREATE TABLE 학생 (
학번 INT,
성명 CHAR(10) NOT NULL,
학과 CHAR(20)
학년 INT,
학점 CHAR(1),
PRIMARY KEY(학번)
FOREIGN KEY(학과) REFERENCES 수강(학과)
ON DELETE SET NULL
ON UPDATE CASCADE,
CONSTRAINT hak CHECK(학년<=4)
);
CREATE VIEW 3학년연락처(학번, 이름, 전화번호) 
AS SELECT 학번, 성명, 이름,
FROM 학생
WHERE 학년=3;  // [학생]테이블의 학번, 성명, 이름 속성을 가져와 같은 속성을 가진 [3학년연락처] 뷰를 생성.

ALTER : 기존에 만들어진 테이블에 새로운 속성을 추가(ADD)하거나 변경(ALTER), 삭제(DROP)할 때 사용하는 명령문.

ALTER TABLE 학생 ADD 주소 VARCHAR(30); // [학생] 테이블에 '주소' 속성을 추가(단. 주소는 가변길이 문자형 30자리까지 입력)

ALTER TABLE 학생 DROP 주소 CASCADE;  // [학생] 테이블에 '주소' 속성을 제거

DROP : 기존에 사용되던 테이블, 스키마, 도메인, 인덱스, 뷰, 제약조건 등을 제거할 때 사용. 전체 삭제.

DROP TABLE 학적 RESTRICT; // [학적] 테이블을 삭제(단 참조 중이면 삭제 안함)
DROP TABLE 학적 CASCADE; // [학적] 테이블을 삭제하고 이 테이블을 참조하는 다른 테이블도 연쇄적으로 삭제

SQL 조작어(DML)

  • SELECT : 테이블에서 원하는 자료를 검색하고자 하는 경우 사용. 산술식에 의한 계산도 수행.
SELECT 학번, 성명 FROM 학생 WHERE 수강과목='데이터베이스';
SELECT DISTINCT 수강과목 FORM 학생 WHERE 학년>=2; // [학생] 테이블에서 학년이 2인 학생의 수강과목을 중복없이 검색.
SELECT SUM(점수) AS 1학년합계 FORM 학생 WHERE 학년=1; // [학생] 테이블에서 학년이 1인 학생의 점수 합계 검색하고 '1학년 합계' 속성을 부여.
SELECT 성명 FROM 학생 WHERE 점수>=85 ORDER BY 학번 DESC; // [학생] 테이블에서 점수가 85점 이상인 학생의 성명을 내림차순으로 검색.
SELECT 학년 FROM 학생 WHERE 점수>=85 GROUP BY 학년 HAVING COUNT(*)>=2; //[학생]테이블에서 점수가 85점 이상인 학생이 2명 이상인 학년을 검색.
SELECT 성명 FROM 학생 WHERE 연락처 LIKE '%7588'; // [학생] 테이블에서 연락처 번호가 '7588'로 끝나는 학생의 성명 검색.
  • INSERT INTO : 기존 테이블에 새로운 자료(튜플)를 삽입하는 경우에 사용하는 명령.
INSERT INTO 학생( 학번, 성명, 학년, 수강과목, 연락처) VALUES (1511, '김정미', 4, '데이터베이스', '123-1234');
  • UPDATE : 테이블의 자료 중에서 값을 변경하고자 하는 경우.
UPDATE 학생 SET 점수=92 WHERE 성명='이영진';
  • DELETE : 테이블의 튜플(자료)을 살제할 경우 사용.
DLELTE FROM 학생 WHERE 학년=2;

SQL 제어어(DCL)

  • COMMIT / ROLLBACK : 연산 내용 승인 / 취소
  • GRANT / REVOKE : 데이터베이스에 대한 권한 부여 / 취소
GRANT UPDATE ON 학생 TO AAA WITH GRANT OPTION; // AAA 사용자에게 [학생] 테이블에 대해 업데이트 할 수 있는 권한을 부여(권한 부여 할 수 있는 권한도 부여)
REVOKE UPDATE ON 학생 FROM AAA CASCADE; // AAA 사용자에게 [학생] 테이블을 업데이트 할 수 있는 권한을 취소.(AAA가 부여한 다른 사용자 권한도 같이 취소)