=> 어떤 테이블을 만들 것인가? 각각의 테이블은 어떤 컬럼을 가질 것인가? 테이블 관계는?
=> 위 내용을 결정/확정 => sw 구성
소통의 도구
=> 덜 익숙한 솔루션을 만들때, 더 많은 소통 필요
모델링
=> 머리속의 복잡합 -> 가시적인 결과물
=> 무 -> 유
=> 무수히 많은 정리되지 않은 요구사항 -> 모두가 이해 가능하도록 구체적인 모습을 보여줌
==
데이터 용어 사전>
고객이름, 고객명/customer_nm, customer_name
=> 테이블명, 컬럼명 모두 개발자에게 명명 권한 부여하면 매우 지저분한 결과
논리적 모델링 단계에서 용어 사전 정의
=> 인터뷰 혹은 요구사항 정의서 등에서 파악된 모든 명사 쪼개서 등록
정리해서 ERD 도구에 등록, 개발자는 논리적 모델링 한글로, 물리 모델링 ERD 도구 영문으로 변경
3~5천개 정도 생성한다고 함
단일값 속성, 다중값 속성
일반 속성, 유도 속성, 저장 속성
나이는 속성으로 관리하지 않음 - 매년 업데이트를 해야하기 때문
카디널리티 - 관계 대응 수
1:1
1:다 - 가장 많음
다:다 - 관계형 db인 중간 관계 테이블 필요
Non-identifying(점선), identifying(실선)
약한 개체(=identifying?), 강한 개체(=Non-identifying?)
다중값 속성
개수가 확정된 거
회원 - 설문지; 재사용성에 대한 고민
회원>
회원 id
성별
전화번호
이메일
설문지>
설문지 id
생성자
생성 시간
제목
설문질문
질문유형
팀원끼리 회의를 통해 아래와 같이 테이블을 구성하였다.
설문지 테이블을 한개로만 만들어야 하는 줄 알고 다 넣어버렸다 ㅎㅎ
users (1) ─── (N) surveys
surveys (1) ─── (N) survey_questions
surveys (1) ─── (N) survey_responses
survey_responses (1) ─── (N) survey_answers
survey_questions (1) ─── (N) survey_answers
-- 사용자 (회원)
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 설문 기본 정보
CREATE TABLE survey (
survey_id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
created_by INT,
start_date DATE,
end_date DATE,
is_active BOOLEAN DEFAULT TRUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (created_by) REFERENCES users(user_id)
);
-- 설문 문항
CREATE TABLE survey_question (
question_id INT AUTO_INCREMENT PRIMARY KEY,
survey_id INT NOT NULL,
question_text VARCHAR(500) NOT NULL,
question_type ENUM('객관식', '주관식', '파일', '링크') NOT NULL,
is_required BOOLEAN DEFAULT FALSE,
allow_file_upload BOOLEAN DEFAULT FALSE,
link_section VARCHAR(255),
page_no INT DEFAULT 1,
question_order INT DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (survey_id) REFERENCES survey(survey_id) ON DELETE CASCADE
);
-- 익명 응답자 (로그인 안 한 사람)
CREATE TABLE respondent (
respondent_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(255),
participated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 설문 응답 (회원 or 비회원 모두 가능)
CREATE TABLE survey_response (
response_id INT AUTO_INCREMENT PRIMARY KEY,
survey_id INT NOT NULL,
user_id INT NULL,
respondent_id INT NULL,
submitted_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (survey_id) REFERENCES survey(survey_id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE SET NULL,
FOREIGN KEY (respondent_id) REFERENCES respondent(respondent_id) ON DELETE SET NULL
);
-- 설문 응답 상세 (문항별)
CREATE TABLE survey_answer (
answer_id INT AUTO_INCREMENT PRIMARY KEY,
response_id INT NOT NULL,
question_id INT NOT NULL,
answer_text TEXT,
file_url VARCHAR(255),
link_clicked BOOLEAN DEFAULT FALSE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (response_id) REFERENCES survey_response(response_id) ON DELETE CASCADE,
FOREIGN KEY (question_id) REFERENCES survey_question(question_id) ON DELETE CASCADE
);

=>
강사님 ERD

재사용성은 떨어진다고 함

개선 버전 - 관계형 테이블 생성
1:n은 커플링이 심함