프로그래밍/DBMS

DBMS 3일차 - 정규화,DML

윤도ri 2021. 12. 9. 23:27

>정규화
-삽입, 수정, 삭제의 이상현상을 제거하기 위해 진행한다.
: 데이터 중복을 최소화 할 수 있고 대부분 3차 정규화까지 진행한다.

 

예를 들어 아래와 같은 정보를 넣으려고 한다. 

아이디 이름 전공 수업코드 수업명 수업인원
apple 김사과 컴공과 C001 너무쉬운자바 30
apple 김사과 컴공과 C002 너무쉬운DBMS 35
apple 반하나 수학과 C002 너무쉬운DBMS 35

<이상현상>

1)삽입이상

새로운 학생이 추가되었고 그 학생은 수강신청한 과목이 없다면 수업코드에 NULL을 넣거나 혹은 'XXXX' 같은 약속된 코드값을 삽입해 주어야 한다. 이러한 현상을 삽입 이상이라고 한다.

 

2)갱신이상

중복 행 중 일부만 변경하여 데이터가 불일치하게 되는 모순의 문제이고 만약 김사과가 전과해서 새로운 과로 이동을 했다면 두 행의 데이터 모두 수정을 해주어야 한다. 이러한 현상을 갱신 이상이라고 한다.

 

3)삭제이상

행을 삭제할 때 꼭 필요한 데이터까지 함께 삭제되는 문제이고 만약 너무쉬운DBMS 수업이 폐강된다면 반하나 의 행을 모두 삭제하게 된다. 반하나의 데이터가 남지 않게 되고 이러한 현상을 삭제 이상이라고 한다.

 

그래서 3차 정규화를 시켜주어야 한다. 

주문 테이블
이름     나이    우편번호    주소     상품명          상품가격
김사과   10       1000       역삼동  바지,양말        1000,500
반하나   20       1001       사당동  바나나            2000
이체리   30       2001       분당구 필터, 오리, 낭만 1000,2000,3000

 

이 경우에도 한 컬럼에 값이 계속 중복되는것을 알 수 있다. --> 활용 어려움 

 

1. 1차 정규화 

-하나의 컬럼에는 값이 1개씩만 있어야 한다.
반복적인 컬럼값이 나타나는 경우에는 그 값의 활용이 어려워진다.

 

이름   나이   우편번호   주소   상품명   상품가격
김사과 10     1000       역삼동 바지      1000
김사과 10     1000       역삼동 양말       500
반하나 20     1001       사당동 바나나    2000
이체리 30     2001       분당구 필터       1000
이체리 30     2001       분당구 오리       2000
이체리 30     2001       분당구 낭만       3000

 

2. 2차 정규화 

-테이블의 모든 컬럼이 서로 관계가 있어야 한다.
:관계가 없는 컬럼들이 존재한다면 테이블을 나누어준다.

 

(유저 테이블)
이름   나이   우편번호   시       구     동
김사과 10     1000    서울시    강남구  역삼동
반하나 20     1001    성남시    분당구   금곡동
이체리 30     1000    서울시    강남구   역삼동 

 

(상품 테이블)

상품명 상품가격
바지    1000
양말    500
바나나 2000
필터    1000
오리    2000
낭만    3000

 

3.3차 정규화 

-하나의 컬럼은 그 외 다른 컬럼을 결정할 수 없다.

 

(유저 테이블)
이름   나이   우편번호   시       구     동
김사과 10     1000    서울시    강남구  역삼동
반하나 20     1001    성남시    분당구   금곡동
이체리 30     1000    서울시    강남구   역삼동

 

-->이 경우 우편번호가 이름에 관여하고 있는데 우편번호는 또 시 구 동에 관여하고 있다.

그러므로 주소 테이블로 빼주는것이 좋다(사람이 많을경우)


(주소 테이블)
우편번호 시 구 동
1000 서울시 강남구 역삼동
1001 서울시 동작구 사당동
2001 성남시 분당구 금곡동

 

>반정규화

-활용하는 단계에서 정규화를 진행하지 않는게 더 편리하다면 반(반대)정규화를 거친다.

 

                                   <참조>

**데이터 무결성에 위배될 수 있는 반정규화를 수행하는 이유 

 

 - 데이터를 조회할 때 디스크 I/O량이 많아 성능이 저하되는 경우

 - 경로가 너무 멀어 조인으로 인한 성능저하가 예상되는 경우

 - 칼럼을 계산하여 읽을 때, 성능 저하가 예상되는 경우   

                         

EX)

1 바지
2 양말

 

주문
아이디 상품번호
apple    1,2

 

이럴땐 굳이 두번 읽는게 아니라 바로 데리고 오는게 더 빠르게 읽어올 수 있다.

그냥 정규화하지 않고 자바에서 넘겨서 split 해주면 되기 때문이다.

 

그래서 반정규화를 하면 테이블이 단순화되며 성능이 향상되는 반면, 정합성과 데이터무결성이 보장되지 않을수있다.

----------------------------------------------------------------------------------------------------------------------------

>DML(Data Manipulation Language)

-데이터 조작어 

-실질적으로 데이터들을 CRUD 하는 언어 

 

1. 데이터 추가

      INSERT INTO 테이블명 {(컬럼명1, 컬럼명2, ...)}
                      VALUES(값1, 값2, ...);

 

    1)컬럼명 생략시 테이블 구성 컬럼 순서대로 값을 넘겨준다.

    2)PK 값이 동일하면 UNIQUE 제약조건 충돌로 데이터 삽입 불가 

    3)컬럼명 지정해주면 해당 컬럼에 들어갈 값만 넘겨준다. 

 

2. 데이터 삭제

      DELETE FROM 테이블명 WHERE 조건식; 

      EX) DELETE FROM test WHERE num1 = 'pk'; 

        -->test 로부터 num1 이 pk 맞으면 그 데이터 삭제해!

1)컬럼명 IN(값1 , 값2 ): 컬럼명 = 값1 OR 컬럼명 = 값2 / 컬럼의 값이 뒤에오는 값들 중에 있다면 삭제해!

 

3. 데이터 수정

    UPDATE 테이블명
     SET 수정할컬럼 = 새로운값 

        WHERE 조건식;

 

  ex1) UPDATE test SET num2 = 222.22 WHERE pr = 'pk002';

    --> 테이블 test에 pr이 pk002인 곳으로 가서 num2 의 값을 222.22로 변경할래!

  ex2) 모든 num2 를 1.3배해서 수정하고 싶은경우

     --->UPDATE test SET num2 = num2*1.3; 

 

4. 데이터 조회

    SELECT 컬럼명1, 컬럼명2, ... FROM 테이블명
          WHERE 조건식

1)부분적으로 컬럼 조회하는 경우 

 SELECT num1, num2 FROM test; 

2)전체의 컬럼을 조회하는 경우 

 SELECT * FROM test;

(*는 전부라는 뜻이다. )

 

 

>>조건식  

 

    = : 같다
    !=, <> : 다르다
    AND : &&
    OR : ||

 

**mySQL 에서는 문자열의 대소 비교가 가능하다(사전순으로 뒤에 있는 값이 더 큰 값)

EX) SELECT * FROM test WHERE pr > 'PK001'; 

---->PK002,PK003 ...이러한 값들이  조회될것이다.

 

>>AS, DUAL

-AS(ALIAS) : 별칭

-DUAL : 간단한 연산, 간단한 값들을 검색하기 위한 1행짜리 내장 테이블 

-mySQL에선 컬럼이름 대신 수식이 들어갈 수 있다.

  1+1
  2

여기서 문제는 이 상태로 자바에 가서 처리후 다시 돌아올때 데이터를 관리하기 어렵게 될 것이다. 그러므로 AS라는 별칭을 부여함으로써 이런 일을 막아준다.  

SELECT 1+1 AS "RESULT" FROM dual;  

  RESULT
  2

 

 

출처: https://haloworld.tistory.com/19 [Halo World]

 

'프로그래밍 > DBMS' 카테고리의 다른 글

DBMS 5일차 -JDBC  (0) 2021.12.15
DBMS 4일차 - DBMS 문법  (0) 2021.12.10
DBMS 2일차 -데이터 베이스, 테이블, 모델링  (0) 2021.12.08
DBMS 1일차 -DBMS  (0) 2021.12.08