앞서배운 디비 설계 순서에 맞게 디비 설계를 해보겠습니다. 게시판 쪽을 담당하여 게시판 위주로 적어보았습니다.
Tools
- draw.io : ERD 다이어그램
- mysql benchwork : EER Diagram 및 물리적 스키마 설계
- intellij Database Tool
나는 처음에 mysql로 EER Diagram으로 진행하다가 intellij 툴로 바꾸었다. 인텔리제이는 자동으로 테이블과 컬럼을 만들어주는게 쉽고 간편하게 되어있어 선택하였다.
1단계 : 요구분석
나의 요구분석 예제
화면요소
- 상단바: 알림 버튼/ 게시판 리스트 / (검색)
- 상단 배너 ( 자리 잡아놓기)
- 메뉴바 : 홈 / 검색 / 글쓰기 / 북마크 / 마이페이지(설정)
- pull to refresh
- 포스팅 리스트
( 포스팅 리스트 필터, 최신순(글 작성기준)/ 최근 업데이트 순(댓글포함 기준) / 인기순 (좋아요 + 뷰) / 댓글순)
뷰 수, 좋아요 수, 댓글 수, 북마크, 글 작성 일자 제공(1시간 이내 분단위, 1시간 이후 시간 단위, 24시간 이후 일별 단 위), 타이틀 및 텍스트(이미지 제공), 작성자 정보 제공(회사 정보, 닉네임)이 존재하고있다.
- 자유게시판(Topic + 타임라인) 시시콜콜한 얘기 등 일반적인 자유 글 게시판인데, 사용자는 회사와 일반 이메일을 사용할수있다.
- 회사라운지는 회사 정보에 따라서 (연봉/ 상사등) 게시글을 올리는 곳인데, 사용자는 회사 이메일만 사용할수있다.
- 현 업계(IT/ 건설/통신/서비스 등)는 업계 트랜드, 업계 타사 동향, (연봉/채용)을 올리는 곳인데, 사용자는 회사와 일반 이메일(기능 제한)을 사용할수있다.
- 현직군라운지(세일즈/기획자/디자인/프로그래머 등) 직군별 면접 질문, 이직 팁(연봉/채용)을 올리는 곳인데, 회사와 일반이메일(기능 제한)을 사용할 수 있다.
- (옵션) 관심업계(IT/건설/통신/서비스 등) 업계 트렌드와 업계 타사 동향, (연봉/채용)을 올리는 곳인데, 회사와 일반 이메일(기능 제한)을 사용할수있다.
- (옵션) 관심 직군 라운지(세일즈/기획자/디자인/프로그래머 등) 직군별 면접 질문, 이직 팁(연봉/채용) 을 올리는 곳인데 회사, 일반 이메일(기능 제한)을 사용할수있다.
1)게시글 메인 페이지 조회 (2일)
- Member 연동된 테이블 조회
- 검색조건 ( 게시글 제목 + 내용으로 검색)
- 정렬탭 선택후 ( 최신순, 인기순으로 선택 가능)
- (기능) 페이징 처리
- (기능) 게시글 조회, 글쓰기창으로 등록
- 게시글 제목 클릭시 상세페이지 이동
2)게시글 상세 페이지 조회 (5일)
- (기능) 이미지 업로드
- (기능) 조회시 조회수 증가
- 북마크 아이콘 클릭시 북마크 테이블에 수정, 등록, 삭제
- 좋아요 아이콘 클릭시 좋아요 테이블에 수정, 등록, 삭제
- 게시글 수정, 삭제, 등록
- 댓글 조회, 수정, 삭제
3) 북마크 페이지 + 좋아요 페이지(1일)
- 북마크 페이지
- 좋아요 페이지
다른 사람의 요구분석 예제
- 한빛 항공사에 회원으로 가입하려면 회원아이디, 비밀번호, 성명, 신용카드 정보를 입력해야 한다
- 회원의 신용카드 정보는 여러 개를 저장할 수 있는데, 세부적으로는 신용카드번호, 유효기간을 저장할 수 있다
- 한빛 항공사에서는 보유한 비행기에 대해 비행기번호, 출발날짜, 출발시간 정보를 저장하고 있다
- 한빛 항공사에서는 좌석에 대한 좌석번호, 등급 정보를 저장하고 있다
- 회원은 좌석을 예약하는데, 회원 한 명은 좌석을 하나만 예약할 수 있고, 한 좌석은 회원 한명만 예약할 수 있다
-
비행기에는 좌석이 존재하는데, 비행기 하나에는 좌석이 여러 개 존재할 수 있고 한 좌석은 반드시 하나의 비행기에만 존재해야 한다.
그리고 좌석은 비행기가 없으면 의미가 없다.
2. 개념적 설계
개념적 설계로 E-R 다이어그램 만들기
작성한 요구사항 명세서에서 데이터베이스를 구성하는데 필요한 개체, 속성, 개체 간의 관계 를 추출하여 ERD를 생성합니다.
1. 개체와 속성 추출
-
대부분 명사로 선별한다
2. 개체 간의 관계 추출
-
개체 간의 관계를 추출한다
-
대부분 동사로 선별한다 (개체간의 관계를 나타내는 동사이여야 한다)
-
관계에 속한 속성도 있을 수 있다
-
1:1, 1:N, N:M
-
필수적인 참여, 선택적인 참여
1. 개체와 속성 추출
나의 개체와 속성 추출 예제
객체 | 속성 | |
boardRandom | 자유게시판 | title, user, companyEmail, email |
compRounge | 회사라운지 | title, user, companyEmail, email |
currentWorkType | 현 업계 | title, user, companyEmail |
currentWorkRounge | 현직군라운지 | title, user, companyEmail |
interestWorkType | 관심업계 | title, user, companyEmail, email |
interestWorkRounge | 관심 직군 라운지 | title, user, companyEmail, email |
common | 공통 테이블 | id, noticeBoardId, appinfoid, listVersion, statusCode, title, linkUrl, createDatetime, createHost, updateDatetime, updateHost, lang_code, osDivisionCode, boardType |
osDivisionCode | os구분 | android, LG+/android/LG U+, iphone1/ iphone2 |
다른 사람의 개체와 속성 추출 예제
객체 | 속성 |
회원 | 회원아이디, 비밀번호, 성명, 신용카드 |
신용카드 | 신용카드번호, 유효기간 |
비행기 | 비행기번호, 출발날짜, 출발시간 |
좌석 | 좌석번호, 등급 |
위쪽 다른사람의 요구분석을 참고해서 만드셨다. [출처 밝힘]
2. 개체 간의 관계 추출
- 일대일(1:1), 일대다(1:N), 다대다(N:M)
- 관계 : 선택적인 관계, 필수적인 관계
나의 개체간의 관계 추출
관계 | 관계에 참여하는 개체 | 관계유형 | 관계속성 |
존재, 업로드 |
게시판(필수) : 한 회원은 자유 게시판에(만) 접근할 수 있다 일반이메일(필수) : 한 이메일은 한 회원이 보유한다. |
1:N |
ex) 자유게시판 |
존재, 업로드 |
게시판(필수) : 회사 이메일을 보유한 회원은 여러 게시판에 접근할 수 있다 일반이메일(필수) : 한 이메일은 한 회원이 보유한다. (기능 제한)
회사이메일(필수) : 한 이메일은 한 회원이 보유한다. |
1:N |
ex) 현 업계, 회사라운지, 관심업계, 관심 직군 라운지 |
존재, 업로드 |
게시판(필수) : 회사이메일을 보유한 회원만 회사라운지 게시판에 접근할 수 있다. 이메일(필수) : 회사 이메일은 한 회원이 보유한다. |
1:N |
ex) 회사라운지 |
다른 사람의 개체간의 관계 추출
관계 | 관계에 참여하는 개체 | 관계유형 | 관계속성 |
보유 |
회원(선택) : 한 회원은 여러 신용카드를 가질 수 있다 신용카드(필수) : 한 신용카드는 한 회원이 보유한다 |
1:N | |
예약 |
회원(선택): 한 회원은 여러 비행기를 예약할 수 있다 비행기(필수): 비행기 한 좌석은 한 회원이 예약한다 |
1:N |
요구사항에서는 없음 ex. 예약번호 예약일자 |
존재 |
비행기(필수) : 비행기 하나에는 좌석이 여러개 존재한다 좌석(필수) : 한 좌석은 하나의 비행기에만 존재해야 한다 |
1:N | 비행기 없이 좌석이 존재할 수 없음 |
IE 표기법
나의 ERD 생성
다른 사람의 ERD 생성
,
3. 논리적 설계
논리적 설계로 릴레이션 스키마 및 테이블 명세서 만들기
테이블 명세서 규칙1 : 모든 개체는 릴레이션으로 변환한다
테이블 명세서 규칙2 : N:M 관계는 릴레이션으로 변환한다
테이블 명세서 규칙3 : 1:N 관계는 외래키로 표현한다
테이블 명세서 규칙4 : 1:1 관계는 외래키로 표현한다
테이블 명세서 규칙5 : 다중 값 속성은 독립 릴레이션으로 변환한다
나의 테이블 명세서
다른 사람의 테이블 명세서
규칙 1 : 다중 값 속성은 독립 릴레이션으로 변환한다
회원아이디 | 성명 | 비밀번호 |
1 | 박씨 | 1234 |
2 | 김씨 | 12345 |
3 | 이씨 | 123456 |
규칙2 : N:M 관계는 릴레이션으로 변환한다
회원 릴레이션 | 회원번호 | 이름 | 부서 |
상품 릴레이션 | 제품번호 | 제품이름 |
주문 릴레이션 | 주문번호 | 회원번호 | 주문날짜 | 제품번호 |
주문 릴레이션 | 회원번호 | 제품번호 | 주문날짜 |
규칙3: 테이블 명세서 규칙3 : 1:N 관계는 외래키로 표현한다
신용카드 릴레이션 | 신용카드번호 | 회원아이디(외래키) | 유효기간 |
좌석 릴레이션 | 좌석번호 | 비행기번호(외래키) | 등급 |
규칙4: 테이블 명세서 규칙4 : 1:1 관계는 외래키로 표현한다
회원 릴레이션 | 사원번호 | 사무실번호(외래키) | 이름 |
사무실 릴레이션 | 사무실번호 | 사원번호(외래키) | 사무실전화번호 |
규칙5: 테이블 명세서 규칙5 : 다중 값 속성은 독립 릴레이션으로 변환한다
사원 릴레이션 | 사원번호 | 이름 |
자녀 릴레이션 | 사원번호(외래키) | 자녀이름 |
4. 물리적 스키마 및 구현
intellij에서 테이블 생성
나의 물리적 구현
다른 사람의 물리적 구현
5. ERD 다이어그램 변경이력
나의 변경이력
다른 사람의 변경이력
ERD설계 | 이슈사항 |
- 회원이 예약할때 비행기+좌석을 같이 예약하지 않나? 좌석은 비행기 없이는 존재하지 않음.
결론 - 좌석은 weak entity임 |
|
- 현실적으로 한 회원은 여러 비행기를 예약할 수 있다. 1. 회원 릴레이션에 비행기번호를 추가하면 회원은 하나의 비행기만 예약할 수 있게 된다 2. 또한 한 비행기에 여러 회원이 예약될 수 있다. 3. N:N이 맞아 보인다 |
6. 결론
출처 sources
'나의 프로젝트 > ERD 설계(DB) 및 기획' 카테고리의 다른 글
나의 프로젝트 : 기획단계 (0) | 2020.03.02 |
---|---|
1. 디비설계 순서 (0) | 2019.12.19 |