2023. 6. 21. 14:29ㆍDB
학습내용
1. 정규화
2. 기본키, 외래키 지정
★ 이 글은 직접 해보고 경험한 글이며 아무것도 모르는 내가 판단해서 적은 글이므로, 분명하지 않을 가능성이 높다. 참고만 해야함★
정규화(Normalization)란?
관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 주고화 하는 프로세스를 뜻한다.
>> 내가 공부하면서 정규화의 의미는, 무결성을 해치지않고, 데이터 수정 및 관리의 용이성 및 편리성을 위해하는 테이블 정리라고 이해하였다.
제1 정규형 (1NF)
1. 각 컬럼이 하나의 속성만을 가져야 한다. 2. 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야 한다. 3. 각 컬럼이 유일한(unique) 이름을 가져야 한다. 4. 칼럼의 순서가 상관없어야 한다. |
제2 정규형 (2NF)
1. 1정규형을 만족한다. 2. 모든 컬럼이 부분적 종속(Partial Dependency)이 없어야 한다. -> 모든 칼럼이 완전 함수 종속을 만족 해야 한다. |
출처:https://code-lab1.tistory.com/48
위 그림을 보면 2정규화가 이해가 바로 될것이다.
여기서 기본키와 외래키를 정한다고 한다면,
(정확하지는 않지만)
학생번호 / 과목 / 성적 테이블에서 -> "학생번호" 와 "과목"이 PK가 될것이며,
과목 / 지도교수 테이블에서 -> "과목" 이 FK로 지정할 것이다.
제3 정규형 (2NF)
1. 2정규형을 만족하고 2. 기본키를 제외한 속성들 간의 이행 종속성(Transitive Dependency)이 없어야 한다. |
출처:https://code-lab1.tistory.com/48
일단 스키마.. 아니 스키마라고 할 것도 없지만 같이 공부하는 학우의 도움을 받아 내가 만들었던 데이터베이스가 아닌
책에서 예제를 보고 따라 진행하였다.
비정규화된 데이터를 가지고 위 그림과 같이 나누었고.
테이블을 생성 하였다.
1. 제품 테이블 (PK = 제품번호)
CREATE TABLE 제품(
제품번호 INT NOT NULL PRIMARY KEY,
제품명 VARCHAR(50) NOT NULL,
재고수량 INT NOT NULL
);
2. 주문목록 테이블(FK = 주문번호, 제품번호)
CREATE TABLE 주문목록(
주문번호 VARCHAR(50) NOT NULL,
제품번호 INT NOT NULL,
주문수량 INT NOT NULL,
주소 VARCHAR(50) NOT NULL
);
3. 주문02 테이블 (PK = 주문번호, FK = 고객번호)
CREATE TABLE 주문02(
주문번호 VARCHAR(50) NOT NULL,
고객번호 INT NOT NULL,
);
4. 고객 테이블(PK = 고객번호)
CREATE TABLE 주문01(
고객번호 INT NOT NULL,
주소 VARCHAR(50) NOT NULL
);
테이블을 위와 같이 만들고 PK, FK를 지정해주면 관계형데이터베이스를 만들 수 있다.
※ 제품 테이블(1.) 만들 때 처럼 처음 기본키를 지정해 줄 수 있지만 만약 그러지 못했다고하면 다음 명령어를 사용해 지정해줄 수 있다.
-기본키 지정- ALTER TABLE 테이블이름 ADD CONSTRAINT pk_아무거나 PRIMARY KEY(기본키설정값); |
★ 외래키 지정
ALTER TABLE "외래키 지정할 테이블 이름" ADD CONSTRAINT "fk_외래키이름(아무거나)" FOREIGN KEY("기본키지정한거") REFERENCES "기본키 지정한 테이블 이름"("기본키") ON DELETE CASCADE; |
이렇게 명령어를 사용해서 지정해줄 수 있지만
테이블 클릭 -> 새로고침 옆 작업... 클릭 -> 제약조건
에서 기본키, 외래키 지정 및 삭제 모두 가능하다.
※ 테이블 데이터값 입력은 엑셀에 데이터를 적어서 임포트해서 쉽게 입력하였다.
1. 제품 테이블 관계 모델
2. 주문 목록 테이블 관계 모델
3. 주문02 테이블 관계 모델
4.고객 테이블 관계 모델
기본키&외래키 지정하면서 발생했던 오류.
정확한 오류 해결방법은 아니었으나, 아래와 같이 했을때 해결되었다.
1. 외래키를 지정하려고 하는데 안되고 아래와 같은 오류가 발생했다.
ALTER TABLE "SCORE" ADD CONSTRAINT "fk_id2" FOREIGN KEY("ID") REFERENCES "INFO"("ID") ON DELETE CASCADE 오류 보고 - ORA-02298: 제약 (HR.fk_id2)을 사용 가능하게 할 수 없음 - 부모 키가 없습니다 |
이는 기본키에 데이터값이 제대로 들어가있지 않아서이다.. 예를들어
외래키에서 참조하려고 하는데이터가 고객번호 : 1007 인데
기본키에 고객번호 : 1007 이 없는것이다. 그래서 기본키지정한 column을 잘 확인하여 데이터가 누락된게 없는지 확인해보자.
2. 오류는 아니지만 무지해서 생긴 오류..
기본키를 설정할때에는.. 중복된값이 있으면 안된다... 너무 당연한데 그렇다... 다시는 이런 실수가 없도록 해야한다.
3. COLUMN 명이 다르면 외래키 지정이안된다.
LTER TABLE "SCORE" ADD CONSTRAINT "fkid" FOREIGN KEY("sub_id") REFERENCES "SUBJECT"("sub_id") ON DELETE CASCADE 오류 보고 - ORA-00904: "sub_id": 부적합한 식별자 00904. 00000 - "%s: invalid identifier" *Cause: *Action: |
이것도 지금 생각해보면 당연한건데, 이 오류는 당연히 그냥 기본키 지정한 COLUMN명과, 외래키로 지정할 COLUMN명을 동일하게 해주면 된다.
한번 이렇게 해보고나니 별것도 아닌데 많이 헤맸다는 생각이 든다.
앞으로 더 열심히 학업에 정진해야겠다.
'DB' 카테고리의 다른 글
[오라클(ORACLE)/SQLDeveloper] 인덱스 생성 부터.. 공부! (0) | 2023.06.21 |
---|---|
[Window]오라클 리스너 Listener 시작 및 오라클 외부 접속 테이블 수정까지 (0) | 2023.06.15 |