블로그 만들기 13. 게시판 구현 : 테이블 구조 이해

Feb 05, 2024
블로그 만들기 13. 게시판 구현 : 테이블 구조 이해

1. 테이블에 데이터를 넣고 조회하는 방법 → 게시글 테이블이 필요함

password
id
user_name
title
content
1234 → 바꾸려면?
1
ssar
제목1
내용1
1234
2
cos
제목2
내용2
1234
3
ssar
제목3
내용3

2. 테이블 설계하는 방법

  • 기본 : 그림이 나와야 함
그림을 보고 컬럼을 뽑아낼 수 있음
  • 컬럼을 늘릴 수 없음 → 설계가 바뀜
  • 중복되면 안됨 일관성 깨짐
  • ,로 구분하면 안됨 원자성이 깨짐 나중에 조회가 안됨\
 
ex) 게시글의 제목만 넣으면 1건 → 쪼갤 필요 없음
2건 이상 → 무조건 쪼개야 함 / 오브젝트니까
오브젝트를 하나의 컬럼에 넣을 수 없음
user_tb
1
1
id
username
password
1
ssar
1234
2
cos
1234
board_tb
N
1
id
title
content
user_id
1
제목1
내용1
1
2
제목2
내용2
2
  • 관계 // 비지니스를 알아야 함
user_tb : 여러 건을 쓸 수 있음 // 1 대 n
반대로도 봐야 함
board_tb : 한명이 한 건을 적을 수 있음 // 1대 1
⇒ 제일 큰 것 적기 // 둘의 관계는 1:n
 
user_tb
1
1
id
username
password
1
ssar
1234
2
cos
1234
fruit_tb
N
1
id
name
price
pty(재고)
1
바나나
100
100
2
딸기
500
50
but_tb
id
user_id
product_id
pty
1
1
2
30
2
1
1
20
n대 n의 관계 : 명단 테이블이 생김 ⇒ 동사(행위) 테이블이 생김
미리 만들 필요 없음
명사를 다 만들고 행위를 만들면 됨
 

3. 1대 N의 관계

  • 양쪽에 한 군데 외래키가 필요함
  • 외래키를 두는 위치 : n쪽
    user_tb
    1
    1
    id
    username
    password
    1
    ssar
    1234
    2
    cos
    1234
    boat_tb
    N
    1
    id
    name
    price(조단위)
    user_id
    1
    이순신함
    1000
    1
    2
    장보고함
    500
    2
     
    댓글 1대 N의 관계
    board_tb
    1
    id
    username
    password
    1
    ssar
    1234
    2
    cos
    1234
    reple_tb
    N
    id
    content
    1
    내용1
    2
    내용2
     
    join을 안하게 되면 하나의 테이블에만 접근하니까 조회가 엄청 빠름
     
    ex) insert와 조회만 하는 DB에서는 중복되서 넣는게 좋음
    insert는 귀찮지만 조회는 굉장히 편함
    수정시 일관성이 빼질 수 있음
    → 실수할 가능성이 있기 때문에 외래키를 이용해서 join을 사용해야 함
     

    4. join

    user_tb
    id
    username
    password
    1
    ssar
    1234
    2
    cos
    1234
    boat_tb
    id
    name
    price(조단위)
    user_id
    1
    이순신함
    1000
    1
    2
    장보고함
    500
    2
    select * from boat_tb where boat_tb id=1;
     

    4. 프로젝션(Projection)

    • 뽑아내기/ 퍼올리기
    • 데이터베이스에서 특정 열이나 특정 표현식을 선택하여 결과로 반환하는 것 :
    for문으로 두바퀴 돌게 됨
    찾으면 옆에 붙음
    user id는 기본키라 중복될 일이 없기 때문에 찾으면 끝나게 됨
     

    5. SQL 쿼리의 실행순서

    1. From:
        • 데이터를 가져올 테이블 또는 뷰를 지정
        • 하드디스크에서 데이터를 읽어오는 단계
        • 이 단계 이후 프로젝션이 가능함
    1. Where:
        • 가져온 데이터에서 필요한 행을 선택
        • 조건에 맞는 행만을 선택하는 단계 / 일종의 필터링 역할
    1. Select:
        • 선택된 행에서 필요한 열을 선택합니다.
        • 프로젝션 단계 : 테이블 전체가 아니라 필요한 열 만을 선택하는 것
    1. Order by:
        • 결과를 정렬
        • 정렬이 필요한 경우, 정렬을 수행하는 단계
        • 비용이 많이 들 수 있는 작업, 필요한 경우에만 사용하는 것이 좋음
    board_tb
    N
    id
    title
    content
    1
    1
    내용1
    2
    2
    내용2
    like_tb
    1
    id
    board_id
    user_id
    1
    1
    1
    2
    1
    2
    • 복합 유니크를 걸어야함
    • 제약 조건 : 비지니즈로 나오는 것 어려움
    설계는 많은 경험이 필요함
    board_tb
    1
    id
    title
    content
    1
    1
    내용1
    2
    2
    내용2
    reply_tb
    N
    id
    content
    board_tb
    1
    1
    1
    2
    1
    2
    복합 유니크를 걸 필요 없음
    board_tb
    id
    title
    content
    1
    제목1
    내용1
    2
    제목2
    내용2
    3
    제목3
    내용3
    4
    제목4
    내용4
    reply_tb
    id
    user_id
    board_id
    content
    1
    1
    1
    댓글1
    2
    1
    1
    댓글2
    3
    1
    2
    댓글3

    6. inner join

    • 두 테이블 간에 일치하는 행 만을 결과로 반환합니다.
    select * from boat_tb b inner join user user_tb u on b.user_id = u.id where b.id = 1;
    주도하는 테이블 (Driving Table) : from 바로 뒤 / 주도권을 가지고 있음
    드리븐 테이블 (Driven Table) : join 뒤 / 조종 당하는 테이블
     
    엔포드 : N 을 가진 테이블이 포링키 / 드라이빙테이블을 가짐
    id
    name
    price(조단위)
    user_id
    id
    paaword
    1
    이순신함
    1000
    1
    ssar
    1234
    2
    장보고함
    500
    2
    cos
    1234
    1
    이순신함
    1000
    1
    ssar
    SELECT board_tb.id, board_tb.title, board_tb.content, reply_tb.content AS reply_content FROM board_tb INNER JOIN reply_tb ON board_tb.id = reply_tb.board_id;
    id
    title
    content
    reply_content
    1
    제목1
    내용1
    댓글1
    1
    제목
    내용1
    댓글2
    3
    제목3
    내용2
    댓글3
     

    7. outer Join

    • INNER JOIN과 달리 일치하지 않는 행도 결과에 포함

    7-1. LEFT OUTER JOIN

    : 왼쪽 테이블의 모든 행을 결과에 포함
    오른쪽 테이블과 일치하는 행이 있으면 해당 행을 포함
    일치하지 않는 경우 오른쪽 테이블의 열 → NULL
    SELECT board_tb.id, board_tb.title, board_tb.content, reply_tb.content AS reply_content FROM board_tb LEFT OUTER JOIN reply_tb ON board_tb.id = reply_tb.board_id;
    id
    title
    content
    reply_content
    1
    제목1
    내용1
    댓글1
    1
    제목1
    내용1
    댓글2
    2
    제목2
    내용2
    댓글3
    3
    제목3
    내용3
    null
    4
    제목4
    내용4
    null

    7-2. RIGHT OUTER JOIN

    : 오른쪽 테이블의 모든 행을 결과에 포함
    왼쪽 테이블과 일치하는 행이 있으면 해당 행을 포함
    일치하지 않는 경우 왼쪽 테이블의 열 → NULL
    SELECT board_tb.id, board_tb.title, board_tb.content, reply_tb.content AS reply_content FROM board_tb RIGHT OUTER JOIN reply_tb ON board_tb.id = reply_tb.board_id;
    id
    title
    content
    reply_content
    1
    제목1
    내용1
    댓글1
    1
    제목1
    내용1
    댓글2
    2
    제목2
    내용2
    댓글3
    null
    null
    null
    댓글4

    7-3. FULL OUTER JOIN

    • 양쪽 테이블 중 어느 한쪽에라도 일치하는 행이 있으면 해당 행을 포함
    어느 한쪽에만 있는 경우 → NULL
    SELECT board_tb.id, board_tb.title, board_tb.content, reply_tb.content AS reply_content FROM board_tb FULL OUTER JOIN reply_tb ON board_tb.id = reply_tb.board_id;
    id
    title
    content
    reply_content
    1
    제목1
    내용1
    댓글1
    1
    제목1
    내용1
    댓글2
    2
    제목2
    내용2
    댓글3
    3
    제목3
    내용3
    null
    4
    제목4
    내용4
    null
    null
    null
    null
    댓글4
     
    Share article

    vosw1