0419 :
제약조건 > 잘못된 값이 입력되는 걸 막기 위해
_ex. _pk, fk, check, not null
정규화 >데이터를 깔끔하게 저장하기 위해서
RDB>
장점 : 수정에 편의
단점 : 조인을 걸면 걸수록 느려진다.
NoSQL, MongoDB, Csandra >
장점 : 조인이 없다, 스키마 X
역정규화(어느 정도는 중복을 허용하자)
정규화 위반 사례 :
join 걸릴 일을 생각해서 의미없는 ID를 생성하는 방법(1)과 CustomerId 혹은 TelephoeNumber로 PK를 거는 방법(2)도 있다
제2정규화 함수적 종료
: 함수적 종속에서 X의 값이 여러 요소일 경우, 즉 (x1,x2)->Y일 경우, y는 x에 대해 종속이다.
출처 : 데이터베이스 개념 설명
제3정규화 예시:
subject 자체를 pk로 잡아도 된다.
숫자로 pk를 잡는게 속도가 빨라서 권장함.
후보키란? pk 다음에 들어갈 수 있는 것들
갱신이상이란? update시 어려울 수 있음
FK(Foreign Key) - 외래키
제약조건> 잘못된 걸 들어가지 않도록 하거나 맞는 값만 들어가도록 유도?
CREATE TABLE t_student(
s_id INT UNSIGNED PRIMARY KEY,
nm VARCHAR(3) NOT NULL,
ph CHAR(13)
);
SELECT*FROM t_student;
INSERT INTO t_student(s_id, nm)
VALUES
(1111,'갑');
INSERT INTO t_student(s_id, nm, ph)
VALUES
(1112,'을','0000'),
(1113,'병','5555'),
(1114,'정','3333');
CREATE TABLE t_class(
c_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
cls VARCHAR(5) NOT NULL,
teacher VARCHAR(5) NOT NULL
);
SELECT*FROM t_class;
INSERT INTO t_class(cls, teacher)
VALUES
('수학', '김하나'),
('과학', '판테온'),
('국어', '오징어'),
('영어','김둘');
DROP TABLE t_score;
CREATE TABLE t_score(
s_id INT UNSIGNED, -- unsigned 안 해주면 에러 터짐
c_id INT unsigned,
score INT,
PRIMARY KEY(s_id,c_id),
CONSTRAINT FK_sid FOREIGN KEY(s_id) REFERENCES
t_student(s_id),
FOREIGN KEY(c_id) REFERENCES
t_class(c_id)
); -- 여러 개의 PK는 위 방법으로 해주는 게 좋음
SELECT*FROM t_score;
INSERt INTO t_score(s_id, c_id, score)
VALUES(1111,3,100)
VALUES(1111,1,100);
INNER JOIN (서로 매칭되는 것만 엮어줘야 한다):
SELECT
B.nm,C.cls,A.score
FROM t_score A
INNER JOIN t_student B
ON A.s_id=B.s_id
INNER JOIN t_class C
ON A.c_id=C.c_id;
SELECT
B.nm,B.s_id, A.s_id, A.score, A.c_id
,C.c_id,C.cls,C.teacher
FROM t_score A
INNER JOIN t_student B -- join을 건다는 의미가 무엇?!
ON A.s_id = B.s_id
INNER JOIN t_class C
ON A.c_id=C.c_id;
> 갑자기 시험 실화가?
inner join, left join에 대한 그림 설명ㅎ..
CREATE TABLE t_board(
iboard INT UNSIGNED PRIMARY KEY auto_increment,
title VARCHAR(100) NOT NULL,
ctnt VARCHAR(500) NOT NULL,
r_dt DATETIME DEFAULT NOW()
);
CREATE TABLE t_cmt(
icmt INT UNSIGNED PRIMARY KEY auto_increment,
iboard INT UNSIGNED,
ctnt VARCHAR(100) NOT NULL,
r_dt DATETIME DEFAULT NOW()
);
INSERT INTO t_board
(title,ctnt)
VALUES
('커피가 좋아 유학을 했다는 게...,,', '철이 없었죠.,,'),
('나 좋아하지 마요.,,','약속');
INSERT INTO t_cmt
(iboard,ctnt)
VALUES
(1,'우유 조아하세요? 아이럽우유');
SELECT*FROM t_board;
SELECT*FROM t_cmt;
SELECT A.*, B.*
,IFNULL(B.ctnt,'댓글없음')
FROM t_board A
LEFT JOIN t_cmt B -- LEFT JOIN.. 레코드 수가 저장이 된다,,? 절대 줄어들지 않는다,.,,?
ON A.iboard=B.iboard;
-- INNER와 LEFT JOIN의 차이점 알기
-- 2번이랑 3번만 실행되게 하세요.
SELECT A.*, B.*
,IFNULL(B.ctnt,'댓글없음')
FROM t_board A
LEFT JOIN t_cmt B
ON A.iboard=B.iboard
WHERE B.icmt IS null;