2주차 / DB를 디비자

Jiyeong·2021년 4월 19일
0

DB

목록 보기
2/4

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;

> 갑자기 시험 실화가?

  1. 표 생성하기(create table)
  2. 테이블, 컬럼 수, 데이터타입
  3. null not null pk fk -> crud
  4. 조인 걸기 - > 뷰를 만들어야 함(뷰가 먼데...?)

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;
profile
깃스타가 되고 싶은 벨플루언서

0개의 댓글