홈으로
| 무료회원가입 | 아이디/비번찾기
추천음악방송
mySQL테이블의 설계
12년 전
지금까지 mySQL계정을 만들고 접속하여 DB를 사용할수 있도록 DB를 select하는것까지 알아봤습니다...

그럼 이제 직접적으로 테이블을 만들고 사용을 해야겠죠...
일단 테이블의 설계에 대해 알아볼까요?

DB에는 정규화라는게 있습니다.
사실 DB얘기를 깊게 하자면 @_@넘복잡하고...제가 아는것도 한계가 있기때문에 간단하게 요점만....어려운 용어 없이 얘기하도록 하겠습니다.

정규화의 예제를 한번 볼까요?
아래와 같은 테이블이 있습니다.....

(수강신청테이블)
이름 주소 과목
---- ----- -----
김씨 서울 과학
김씨 서울 수학
이씨 인천 과학
이씨 인천 수학
이씨 인천 국어
박씨 서울 국어

위와 같은 수강신청 테이블이 있다고 볼까요....
보아하니......누가 어디살고 어떤과목을 신청했다...라는 내용인데...

김씨는 과학,수학을 듣고....이씨는 과학,수학,국어...를 듣습니다.
그리고 박씨는 국어만 듣죠....

그런데...문제가 있죠....
김씨가 두번 나옵니다.....왜냐면 과학과 수학...두가지 이기 때문이죠...
그리고 이씨는 세번나옵니다......과학,수학,국어 이기 때문이죠....
그러면서 쓸데없는 서울이 두번나오고......인천은 세번 나왔죠......

이 얼마나 낭비입니까........
DB도 용량의 한계가 있는거죠..(-_-물론 이정도의 간단한 테이블로는 기별도 안가죠...)

어쨌든.....이런게 좀더 방대한 데이터를 다루는것이었다면....
좀 문제가 생길겁니다....억지라고요?;;;-_-

그럼 어떤 메일사이트를 예로 들어볼까요?
D라는 메일 사이트에는 회원마다 주소록이란 기능을 지원해 준답니다.
자신이 자주 보내는 사람주소를 주소록에 등록하는거죠....

위예제처럼 테이블을 짠다면 이렇게 될겁니다....

회원ID//비밀번호//이름//.....그외 회원정보....//주소록이름//주소록주소

이런식으로 엄청난 데이터가 주소록에 사람이 추가될때마다 계속 들어가는거죠.........-_-이런형식은 그대로.....아웃! 입니다.....


자 암튼 이런 이유로 정규화라는걸 합니다;;;
정규화된모습을 한번 볼까요?

(학생테이블)
이름 주소
---- -----
김씨 서울
이씨 인천
박씨 서울

(수강신청테이블)
이름 과목
---- -----
김씨 과학
김씨 수학
이씨 과학
이씨 수학
이씨 국어
박씨 국어

자 위처럼...테이블이 두개가 생겼습니다.
먼저 학생테이블에는 그 학생에 대한 모든 정보가 들어가 있는거죠...
주소 이외에도 성별이나 학번 또는 주민등록번호....뭐 그런거죠...
(-_-저기 써있는 그대로만을 보시면 안됩니다)

그리고 밑에 수강신청 테이블에서는 그 학생 이름과 과목만이 들어갑니다. 그렇기 때문에 과목이 아무리 많이 들어갔다 하더라도....
그 학생의 전체 정보가 반복되는 경우는 없습니다.

이대로라면 이전의 모델보다는 훨씬 경제적이고 합리적입니다. 그렇죠?
이렇게 테이블을 쓰기좋게 설계하는것을 정규화 라고 한다더군요;;;

엇 그런데....이렇게 테이블을 두개로 갈라놓으면 어떡하죠?....
자 볼까요?....

이씨가 수강하는 과목과 주소를 알고 싶습니다.....
그럼 이렇게 합니다.....학생테이블에서 이름이 이씨인 사람의 정보를 가져오고 또,수강신청 테이블에서도 이름이 이씨인 사람의 정보를 가져오면 되겠쬬.....-0-오오오;;;

자 여기서 나오는 말이 primary key라는것 입니다.
그 행의 주키 라는 얘기인데....(기본키라고 부른다죠~)
이는 각각의 행을 구분해줄수 있는 항목을 말하는 것입니다....

예를 들면 우리가 구입하는 제품에는 모두 제품번호라는게 있죠?
그리고 제품번호는 절대 중복되지 않습니다....
왜냐면 중복되면 각각의 제품을 구분할수 없으니까 말이죠...

primary key도 마찬가지 입니다....
독립적이면서 유일한 값을 갖고 있는것을 primary key로 정해줘야 합니다. 그리고 값이 비어있으면 안돼겠죠....비어있는 값은 null이라고 하는데 여기서 나오는 말이 not null입니다.....

즉, primary key의 조건은....unique하고 not null입니다......@_@
^^...유일하면서 비어있지 않으면 된다는거죠....

자 그럼 학생테이블에서는......어떤가요?
김씨....이씨.....박씨.........
유일한것 같지만.....어딘가 좀 -_-a;;;;
김씨,이씨,박씨....면 우리나라에서 젤 많은 성씨죠;;;
이름이란건 중복될수 있습니다.....그래서 primary key로는 쓸수 없습니다.

그다음은 주소를 볼까요?....
주소역시 무리죠......@_@ 보나마나 입니다...
생각해보세요....어떻게 사람을 주소로 구분한답니까;;;;

학교에서 선생님이 학생을 부를때...........야! 너 거기 서울시 xx구 ㅁㅁ동에 사는 놈.... 이라고 부르진 않죠........

이런경우 많을겁니다.....오늘은 28일......이니까......28번...이거 풀어봐...
그렇슴다.....바로 번호 였던것임다......-0-
학생에겐 학번이란게 있죠......primary key의 조건에 맞춰볼까요?
학번은 학생에게 하나씩 부여되는 것으로 유일한 번호이고....
학번이 없는 학생은 없습니다......+_+ 그래서 우린....primary key로 학번을 쓰기로 합니다.......짝짝짝...-0-;;

(학생테이블)
학번 이름 주소
---- ---- -----
0001 김씨 서울
0002 이씨 인천
0003 박씨 서울

(수강신청테이블)
학번 과목
---- -----
0001 과학
0001 수학
0002 과학
0002 수학
0002 국어
0003 국어

자 위와 같이....학번이라는 primary key를 써서 테이블을 바꿔봤습니다.
자 그럼 이제 다시 이씨가 수강하는 과목을 찾아볼까요?

먼저 학생테이블에서 이씨를 찾아서 학번(primary key)이 뭔가 봅시다...
앗....0002로군요...?
그럼 이제 수강신청테이블로 가서 학번이 00002인 과목을 모두 가져옵니다....그럼 결국 과학,수학,국어.....가 나오겠죠.......

엇....그런데...학생테이블에서 학번이 primary key였는데....
수강신청테이블에서도 primary key일까요?-_-

primary key의 조건을 살펴보세요......중복되는 값이 나오기 때문에 수강신청테이블에서는 primary key가 될수가 없죠......
학생테이블에서는 primary key이지만 수강신청테이블에서는 primary key가 아닙니다.....이럴경우...즉, 다른 테이블에서 primary key인 경우에 이를 foreign key라고 부릅니다........~


자.....여기까지 입니다....
제 생각엔 솔직히.......여기까지만 이해하면 어떤 형태의 테이블이라도 만들 수가 있습니다.....-_-a;;;;머리를 잘 굴려야죠...

끝내기 전에 한가지만 더 예를 들까요?

게시판에 보면 댓글이란게 있습니다..커맨트 라는 것인데....
각 글마다 따로 쓸수가 있죠.........말하자면......1번글에 커맨트를 5개 쓸수가 있고......2번글에는 2개를 쓸수가 있고......그렇죠?...

원리는 위 의 수강신청 테이블과 같습니다...
게시물 테이블이 있고......커맨트 테이블이 따로 있는거죠.....
그래서 만약 2번글이라면.......커맨트 테이블에서 2번글로 되어진 커맨트를 모두 가져오는 겁니다......

(게시물테이블)
번호 글내용 글제목
---- ------ --------
0001 .....
0002 ..
0003

(커맨트테이블)
번호 커맨트
---- -------
0001 ......
0001 ....
0002 ..
0002
0002

이해가시죠?;;;
추천추천 : 314 추천 목록
번호 제목
3,046
 Vimeo (비메오) API 를 사용하여 플레이어 컨트롤하기
3,045
 iframe 사용시 하단에 발생하는 공백 제거방법
3,044
 아이프레임(iframe) 전체화면 가능하게 하기
3,043
 부트스트랩(bootstrapk)에서 사용하는 class명 정리
3,042
 부트스트랩 CSS
3,041
 크롬에서 마진 조절
3,040
 PHP 현재 페이지의 도메인명이나 url등의 정보 알아오기
3,039
 PHP preg match all()
3,038
 PHP 로 웹페이지 긁어오기 모든 방법 총정리!
3,037
 [PHP] 원격지 파일 주소 노출 안하고 curl로 다운로드 받기
3,036
 PHP 함수 정리
3,035
 아이프레임(iframe) 비율 유지하면서 크기 조절하는 방법
3,034
 PHP 배열에서 무작위로 하나 뽑아주는 array rand() 함수
3,033
 PHP 정규식 정리
3,032
 PHP 정규식을 활용한 태그 및 특정 문자열 제거 및 추출 방법
3,031
 php 크롤링 또는 파싱 함수, 정규식 모음
3,030
 제이쿼리 기본 명령어
3,029
 웹페이지 가로 모드세로 모드 인식하기
3,028
 모바일 웹 화면 강제 회전(가로모드 고정)
3,027
 [HTML5]에서 frameset 대체 방법과 iframe 속성
3,026
 HTML <Audio> 사용법
3,025
 윈도우10 시스템파일 손상 (초간단 오류 복구방법!!)
3,024
 PHP 파일 존재 여부 파악하기(로컬 파일 존재 및 원격지 파일 존재)
3,023
 [CSS] 박스 세로 가운데 중앙 정렬 6가지
3,022
 CSS Layout 수평 & 수직 정렬
목록
뮤직트로트 부산광역시 부산진구 가야동 ㅣ 개인정보취급방침
Copyright (C) musictrot All rights reserved.