8장_테이블과뷰(노장래).

Download Report

Transcript 8장_테이블과뷰(노장래).

- @ + 테이블 -
순서
 DB 설계
 정규화
 데이터 타입
DB 설계
 요구 분석
 개념적 설계
<- 관계도(ERD) 작성
 논리적 설계
<- 스키마 설계, 정규화
 물리적 설계
<- DBMS 결정, 데이터 타입,
제약조건, 관계 정의
 구현 및 테스트
논리적 설계
 정규화
1. 제 1 정규화
2. 제 2 정규화
3. 제 3 정규화
4. 역정규화
5. 요구사항 확인
정규화
 정규화의 필요성
- 저장 공간 최소화(중복 최소화)
- 자료의 불일치 최소화
- 자료 구조를 안정화
- 자료의 삽입, 삭제, 갱신시 이상현상 방지
- 대신 조인 발생
이상현상
 입력이상
- 데이터 입력 시 필요 없는 속성까지 입력해야 하는 현상
 수정이상
- 데이터 수정 시 원하지 않는 데이터까지 수정되는 현상
 삭제이상
- 데이터 삭제 시 필요한 데이터까지 삭제되는 현상
기본키, 외래키
 기본키
- 튜플을 유일하게 식별하기 위해 반드시 필요
- 중복된 값을 가질 수 없음
- NULL 값을 가질수 없음
 외래키
- 다른 릴레이션의 기본키를 참조하는 속성 또는 속성들의 집합
- 외래키는 참조 릴레이션의 기본키와 동일한 키 속성을 가짐
제 1 정규화
 제 1 정규화
-> 반복되는 그룹속성이 존재할 경우 그 그룹을 분리하여 새로운 엔
티티타입을 추가한 후 기존의 실체와 1:N의 관계를 형성해 준다.
- 저장공간을 최소화하기 위해서
- N:N 관계를 1:N으로 바꾸기 위해서(RDBMS에 맞게)
- 이상 현상 제거
 참고 : RDBMS(관계형 데이터베이스)
- 데이터베이스는 최소한 의미를 가지는 테이블로 구성되며 그 테이
블에 있는 컬럼으로 다른 연관된 테이블 연결(JOIN)
- 확장 용이!
제 1 정규화
고객 ID
이름
전화번호
계좌번호
1
홍
1111-1111
D199
1
홍
1111-1111
L25
2
이
1141-2111
D201
3
윤
7777-2929
D79
3
윤
7777-2929
L51
중복 발생!
고객 ID (FK)
이름
전화번호
1
홍
1111-1111
2
이
1141-2111
3
윤
7777-2929
계좌번호 (FK)
고객 ID (PK)
D199
1
L25
1
D201
2
D79
3
L51
3
제 1 정규화
 중복 감소
 입력 이상 – 고객 정보만 추가 하고 싶으면 필요하지 않은 데이터도
같이 입력해야 됨
 수정 이상 – 고객ID ‘1’의 전화번호 변경시에 모든 ‘1’의 전화번호 변경
 삭제 이상 – ‘D201’ 계좌 삭제시 고객ID ‘2’의 정보도 삭제
제 2 정규화
 제 2 정규화(복합키인 경우만)
-> 기본키 2개 이상으로 구성되는 테이블에서 일부 속성에 대해서
만 부분적으로 함수 종속적인 것을 분리 즉, 부분함수 종속성을 제거
- 원하는 바는 제 1정규화와 동일
제 2 정규화
학번 (FK)
과목번호 (FK)
성적
과목명
강의실
학생이름
100
A11
90
MSSQL
201호
홍
100
B12
80
ORACLE
301호
홍
101
A11
95
MSSQL
201호
이
102
B13
85
MYSQL
303호
김
완전 종속!
부분 종속!
학번 (FK)
학생이름
과목번호 (FK)
과목명
강의실
100
홍
A11
MSSQL
201호
101
이
B12
ORACLE
301호
102
김
B13
MYSQL
303호
학번 (FK, PK)
과목번호 (FK, PK))
성적
100
A11
90
100
B12
80
101
A11
95
102
B13
85
제 2 정규화
 중복 감소
 입력 이상 – 학생정보 or 과목정보만 추가가 안됨
 수정 이상 – 강의실 변경시 해당 과목 모든 강의실 변경
 삭제 이상 – ‘B13’ 과목번호 (과목) 삭제시 ‘102’ 학번(학생)도 같이 삭제
제 3 정규화
 제 3 정규화
-> Primary key가 아닌 일반 column으로 종속되어지는 column 분리.
A -> B, B -> C 그러므로 논리적으로는 A -> C
이 런 관계(이행적 종속 관계)를 분리한다.
- 이상 현상 제거
제 3 정규화
계좌번호 (FK)
고객ID
잔고
이름
1111-1111
101
7000
홍
1234-1234
102
8000
김
7777-3333
101
3000
홍
1313-1313
103
5000
이
이행 종속!
계좌번호 (FK)
고객ID (PK)
잔고
1111-1111
101
7000
101
홍
1234-1234
102
8000
102
김
7777-3333
101
3000
103
이
1313-1313
103
5000
고객ID
(FK)
이름
역정규화
 시스템 성능을 위해 정규화에 위배되는 행위
 조인을 줄이기 위해 데이터를 중복
- 자주 조인 or 연산되는 부분은 성능을 위해서 일부로 중복을 허용
역정규화
- 로그인시에 보여줄 화면
고객ID
이름
등급
마지막 로그인
101
홍
VIP
2011-05-10 17:11:02
고개ID
이름
등급
전화번호
주소
고객ID
로그인
로그아웃
101
홍
VIP
1234
서울
101
2011-05-10 11:25:37
2011-05-10 11:28:40
102
이
일반
1171
부산
101
2011-05-10 17:11:02
2011-05-10 18:38:21
103
김
일반
5842
광주
102
2011-05-10 18:02:55
2011-05-10 22:11:11
104
나
VIP
3684
대전
103
2011-05-10 18:33:41
2011-05-10 18:41:25
102
2011-05 -10 19:41:11
2011-05-10 20:01:31
테이블이 이렇게 구성되어 있으면 로그인시마다 로그인 정보 테이블 계산 and 조인
로그인 관련 테이블에 데이터가 100억건 들어 있다면!!??
역정규화
- 조인과 연산을 피하기 위해서 데이터를 중복 저장
고개ID
이름
등급
전화번호
주소
마지막 로그인
101
홍
VIP
1234
서울
2011-05-10 17:11:02
102
이
일반
1171
부산
2011-05-10 18:02:55
103
김
일반
5842
광주
2011-05-10 18:33:41
104
나
VIP
3684
대전
2011-04-02 02:17:43
고객ID
로그인
로그아웃
101
2011-05-10 11:25:37
2011-05-10 11:28:40
101
2011-05-10 17:11:02
2011-05-10 18:38:21
102
2011-05-10 18:02:55
2011-05-10 22:11:11
103
2011-05-10 18:33:41
2011-05-10 18:41:25
102
2011-05 -10 19:41:11
2011-05-10 20:01:31
데이터 타입
데이터 타입 선택
 적절한 데이터 타입 선택으로 성능 향상
 예
-
BIGINT
INT
SMALLINT
TINYINT
데이터 타입 선택





-- 테이블생성--------------------------Create table table_bigint
(
id bigint
)




Create table table_int
(
id int
)




Create table table_smallint
(
id smallint
)




Create table table_tinyint
(
id tinyint
)

-----------------------------------------
데이터 타입 선택
DECLARE @NUM INT
SET @NUM = 1
SET @NUM = 1
WHILE (@NUM < 100000)
begin
WHILE (@NUM < 100000)
begin
insert into table_smallint values (100)
insert into table_bigint values (100)
SET @NUM = @NUM + 1
end
-------------------------------------------------------SET @NUM = 1
SET @NUM = @NUM + 1
end
-------------------------------------------------------SET @NUM = 1
WHILE (@NUM < 100000)
begin
WHILE (@NUM < 100000)
begin
insert into table_tinyint values (100)
insert into table_int values (100)
SET @NUM = @NUM + 1
end
SET @NUM = @NUM + 1
end
데이터 타입 선택에 따른 용량
데이터 타입 선택에 따른 용량
TINYINT, SMALLINT
 데이터의 크기는 틀리나 저장시에 TINYINT가 2바이트로 저장되기
때문에 SMALLINT와 용량이 같아집니다.
DATE 타입
 DATETIME(8byte)
- 1753-01-01 00:00:00 ~ 9999-12-31 23:59:58.997
- 1/300초의 정확성
 SMALLDATETIME(4byte)
- 1900-01-01 00:00:00 ~ 2079-06-06 23:59:00
- 분까지의 정확성
 DATETIME2(자리수에 따라 6~8byte)
- MSSQL 2008 버전부터
- 1-01-01 00:00:00 ~ 9999-12-31 23:59:59.9999999
DATE 타입
 DATETIME
- 1753-01-01 00:00:00 시작
- 서양에서 1753년 이전에는 두개의 달력을 사용했기 때문
 SMALLDATETIME
- 4바이트 중에 2바이트(0~65535)가 년,월,일을 표현하는데
1900-01-01 + 65535를 하면 2079-06-06이 됨
DATE 타입
 DECLARE @SDD SMALLDATETIME
 DECLARE @DD DATETIME
 SET @SDD = 0
 SET @DD = 0
--'1900-01-01 00:00:00'
--'1900-01-01 00:00:00'
 SELECT @SDD AS DATETIME_Start

, @SDD + 65535 + (1439.0/(24*60)) AS DATETIME_End
 SELECT @DD - 53690 AS SMALLDATETIME_START

, @DD + 2958463 + (86399.0/(24*60*60)) AS SMALLDATETIME_End
DATE 타입
끝!!
감사합니다!
질문은 쉬운것만 받습니다.
어려운건 조장님께서…?