본문 바로가기
  • think normal
새로워지기/서른의 생활코딩

삼팔광땡~ MYSQL 입문기 08 - 관계형 모델, 정규화, 테이블 설계, 트랜젝션

by 청춘만화 2019. 2. 15.

삼팔광땡~ MYSQL 입문기 08 - 관계형 모델, 정규화, 테이블 설계, 트랜젝션


이제 마지막 입문기가 될 것 같습니다. 적어도 기본편에 대해서는요,

이번 실습은 하나가 아닌 여러 테이블을 활용해 데이터를 검색해보는 실습을 하게 될 예정입니다.

( 아, 미리 언지를 드리면 실습에 사용되는 테이블은 동일하지만 책에서 설명하고있는 예제와는 똑같지는 않습니다.  >< ) 



1. 관계형 모델   

SQL에서 말하는 테이블 = 릴레이션(Relation) = 관계형 모델의 기본적인 요소 

관계형 모델의 릴레이션(테이블)은  /어트리뷰트/attribute/속성 + /튜플/tuple/레코드  로 구성되었습니다. 

관계형 모델은 데이터 구조에 관해 정의합니다 = 릴레이션은 튜플의 집합이며 릴레이션(테이블)에 대한 연산이 집합에 대한 연산에 대응됩니다. 

= 관계대수 이론 

Role 1. 하나 이상의 관계를 바탕으로 연산한다.

Role 2. 연산한 결과, 반환되는 것 또한 관계이다.

Role 3. 연산을 중첩 구조로 실행해도 상관없다.


α )   찾아보니 유형에도 두 분류가 있네요, 외부 자료와 믹스해서 정리했습니다

유형 1)  순수 관계 연산자 

선택 Select - (튜플) 추출하는 것, where 구 조건을 지정해 데이터 검색하는 것, 릴레이션(테이블)에 존재하는 행(튜플) 중에서 선택 조건을 만족하는 행(튜플)의 부분집합을 구하여 새로운 릴레이션(테이블)을 만든다. 릴레이션(테이블)의 행(튜플)을 구하는 것이므로 수평연산이라고도 한다.    

 SELECT * from sample72_y WHERE y < 2;

투영 Project - (속성, 어트리뷰트)의 추출과정, select 구에 결과로 반환할 열을 지정하는 것, Project는 주어진 릴레이션에서 속성 List에 제시된 Attribute만을 추출하는 연산이다. 릴레이션의 열(세로)에 해당하는 Attribute를 추출하는 것이므로 수직 연산자라고도 한다.    

 select y from sample72_y;


결합 Join - SQL에서는 내부결합을 의미    

select * from sample72_y INNER JOIN sample411 ON sample72_y.y = sample411.no;


α )   부가적으로, 이 예제를 바로 외부 결합으로 실습해보면 아래와 같습니다.


여집합 Devision - 두개의 릴레이션(테이블)이 있을때 하나의 속성(A)이 다른 하나의 속성(B)값을 모두 가진 (튜플, 레코드)에서 속성(B)의 속성을 제외한 속성만을 구하는 연산이다.    


유형 2)  일반 집합 연산자 

합집합 Union -         릴레이션(테이블) 간 덧셈 = SQL의 UNION    

 select * from sample72_x UNION select * from sample72_y;

교집합 intersect -    릴레이션(테이블) 간 공통부분 = SQL의 INTERSECT    

 select * from sample72_x INTERSECT select * from sample72_y;

차집합 difference -  릴레이션(테이블) 간 뺄셈 = SQL의 EXCEPT      

 select * from A EXCEPT select * from B;

곱집합 cartesian product - 릴레이션(테이블)의 대전표를 조합하는 연산

 select * from A, B;
 select * from A CROSS JOIN B;


2. 데이터베이스 설계   

스키마 설계라고도 한다. 주로 테이블의 이름이나, 열 그리고 자료형, 기본키 등 을 결정하는 것으로 그 일련의 과정은 이 테이블을 저 테이블과 연결할 때  테이블과의 관계를 고려하게된다. 

명은 논리명물리명을 가지고 있다. SQL에서 사용되는 명칭은 물리명이고 물리명에 대한 설명 또는 설계상 이름이 논리명이라고 할 수 있다. 굳이 두개의 명칭을 가지고 있는 까닭은 열 명은 기본적으로 알파벳으로 되어 있고 SQL를 작성이 너무 길면 가독성이 떨어지기 때문에 단어의 길이가 제한적이기 때문이다. (물론 다른 이유도 많지만)

자료형은 각 테이블의 각 열에 대해 저장할 수 있는 타입을 선언한 것입니다.

설계의 순서는 보통 개논물(개념설계 -> 논리설계 -> 물리설계)을 따른다.



3. 정규화    

테이블을 올바른 형태로 변경하고 분할하는 것을 말합니다. 물론 여기서 말하는 올바른 형태란 주관적 기준이라 할 수 있습니다. 다만 정규화라는 가이드는 그동안 많은 개발자들이 고안하고 누적해온 노하우를 바탕으로 하고 있으니 참고하면 유익할 것입니다.

개인적으로 생각하는 방법에 대한 느낌적인 느낌은, 혹시 엑셀 다르시는 분?  ;D  엑셀의 경우 하나의 필드에 단어가 아닌 문장이 들어가면 연산을 하기 힘들어서 숫자나 날짜, 주요 키워드는 필드를 나눠 칸칸이 입력하게되잖아요? 그런것과 비슷하게 쪼개는 것이 아닐까합니다. 

이를테면 방법1로 작성된 필드는 이와같은 데이터들이 누적되었을때 활용하기가 어렵다. 거의 불가능하다. 하지만 방법 2와 같은 형태로 누적된 데이터는 얼마든지 지지고볶아 다양한 형태의 새로운 데이터베이스를 구축할 수 있다. 간단한 예로 아래와 같이 방법2로 작성된 엑셀은 어렵지 않게 수치화 할 수 있게 된다. 자료의 정보화.

요컨데 가공할 수 있는 데이터를 만들 수 있느냐 없느냐가 관건이 아닐까 한다.  뇌피셜은 여기까지하고 책으로 다시 돌아가서, 정규형에는 절차가 있다. 그 절차를 기록해보도록 한다.


1) 제1 정규형 

(1) 하나의 셀에 하나의 값만 저장

(2) 반복되는 데이터를 가로(열)가 아닌 세로(행) 방향으로 늘리는 과정 

(3) 이는 테이블을 분할하되 각 연관된 테이블끼리 결합할 수 있도록 기본기 PK 와 외래키 FK 를 설정하는 과정에으로 이뤄진다.

2) 제 2정규형

(1) 함수의 종속속성(기본 키 값을 이용해 데이터를 특정 지을 수 있는 것)을 찾아내서 테이블을 분할. 

3) 제 3정규형

(1) 기본 키 이외의 부분에서 종속이 없는지를 조사 

(2) 제 5 정규형까지 존재하지만 보통은 제3 정규형까지의 정규화를 채택한다고 합니다.

4) 정규화의 목적

하나의 데이터는 한 곳에 라는 규칙을 기반으로 반복되거나 중복되는 부분을 찾아내서 테이블을 분할하고 기본키를 통해 각각의 테이블을 연결하여 사용하는 것을 정규화라고 정의할 수 있겠습니다. 이러한 과정을 거치면서 데이터 구조를 개선하고자하는 까닭은 데이터가 한 곳에 저장되도록하여 다른 곳에서 일부의 데이터가 변경 또는 추가되더라도 자동으로 관련 데이터 들이 누적될 수 있도록 하기 위함입니다.



4. 트랜잭션    

1) start transaction - 트랜잭션 구동시키기(비유하자면.. 블로그 작성 시 임시 저장 버튼 생성 ? 정도)

 start transaction


2) commit - 데이터베이스 갱신하기 (비유하자면.. 블로그 작성 시 임시 저장 버튼 클릭? 정도)

 commit;


3) rollback - 데이터베이스를 되돌리기 (비유하자면.. 블로그 작성 시 뒤로가기 버튼? 정도)

 rollback;


참고로 MySQL은 ORACLE과 달리 트랜잭션을 위한 선언을 따로 해주고 관리해야한다. 관련한 내용이 담긴 MySQL 트랜잭션과 관련한 내용이 담긴 블로그(링크1) 를 걸어둔다. 

아, 이곳도 좋(링크2). 간략히 잘 설명되어 있는 듯 하다.




꺄~ 끝입니다~ 무는 잘 썰으셨습니까요?

각자의 칼이 어떤 칼인지는 몰라도 

아무리 칼을 뽑았어도 

타인에게 상처를 주지는 말기로해요~

그럼 맛있게 무를 드세요~ 


고생하셨습니다~ 이어서 빠른 시간 내,  


SQL 고급편을 실습하도록 하겠습니다~

고급편에서는 기본적으로 배운 내용들을 조금 더 빠르고 효율적으로 사용할 수 있는 내용을 다루고 있습니다~

그럼 오늘도 따뜻한 하루되세요~


끄읏.

댓글