본문 바로가기

프로젝트/KimsBoard

[DB]RDBMS에서의 특정테이블이 배열을 필드로 가질때, 그밖의 테이블간 관계 설정

일반적으로 관계형 데이터베이스(RDBMS)에서는 하나의 필드에 객체, 배열 혹은 JSON형태의 데이터가 들어갈 수 없다. 예를 들어 설명 하자면 board라는 테이블을 만들려고 하는데 board테이블은
boardNumber, title, content, boardTitleImage, boardImageList, writeDatetime, favoriteCount, commentCount, viewCount, writerEmail, writeNickname, writerProfileImage 와 같은 필드들로 구성이 된다. 이중 boardImageList는 배열인데 RDBMS에서는 필드에 배열형식이 들어갈 수 없다는 것이다.

이 문제에 대한 해결책이 ORM 그리고 관계를 지어서 새로운 테이블을 하난더 파생시키는 것이다(참고로 boardTitleImage의 경우 새롭게 만들어진 boardImageList테이블에서 하나를 빼오면 되는 것이다). 이렇게 새롭게 만들어진 테이블의 이름은 boardImageList라고 하지 않고 단순하게 image로 하기로 한다. 그리고 board테이블에는 image가 들어갈수도 있고 들어가지 않을수도, 다수개가 들어갈 수도 있으므로 1:N의 관계가 된다(ERD도구에서는 Zero N이 있으므로 이것으로 한다).

 

 

위와 같이 테이블을 만듦으로써 기존 board테이블에 있던 두 개의 필드인 boardTitleImage와 boardImageList는 board테이블의 필드에서 뺄수 있게 된다. 그리고 boardTitleImage는 image중 하나가 오게됨.

 

한명의 사용자가 여러개의 게시물을 작성할 수 있으므로 user와 board의 관계는 1:N이다(도구에서는 Zero N도 있음). user와 board의 관계를 맺어줌으로써 board의 필드인 writerEmail, writeNickname, writerProfileImage 필드를 board테이블에 따로 만들지 않고 user테이블과의 join(조인)연산을 통해서 알아낼 수 있다.

=============================================================================

댓글, 좋아요는 사용자(user)와 게시물(board)과 연관된다. 한명의 사용자는 각 게시물당 하번씩만 여러개의 게시물을 대상으로 댓글, 좋아요를 누를 수 있다. 즉 favorite(좋아요)테이블은 두개의 외례키인 email, board_number가 하나의 기본키로 작동하게 된다.  이를 ERD로 표현하면 아래와 같다.

댓글(comment)같은 경우는 favorite(좋아요)과는 다르게 한명의 사용자가 하나의 게시물에 여러번 댓글을 남길수 있다.

따라서 email과 board_number를 primary key로 지정(파란색키)하지 않고 그대로 빨간색인 외례키로 남겨놓는다(ERD 도구 사용주의). 그리고 따로 pk인 comment_number를 아래와 같이만들어 준다.

 

마지막으로 위와 같은 기능으로써 역할을 하는 user, board, comment, favorite과는 다르게 기록을 남기는 역할을 하는 요소가 필요하다. 그 요소에 대한 테이블을 search_log라는 이름으로 하나 만들어 준다. 이는 데이터가 쌓이는 테이블이다.