inblog logo
|
vosw1
    Spring

    블로그 만들기 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

      RSS·Powered by Inblog