10/15

AI·2025년 10월 15일
  1. Persistence Layer
  • 데이터 저장/제공
  • 서비스 제공(multi client)
  • 복잡한 데이터 저장/관리 - 구현하고자 하는 business logic
    => RDBMS(MySQL)

=> 어떤 테이블을 만들 것인가? 각각의 테이블은 어떤 컬럼을 가질 것인가? 테이블 관계는?
=> 위 내용을 결정/확정 => sw 구성

  1. 소통의 도구
    => 덜 익숙한 솔루션을 만들때, 더 많은 소통 필요

  2. 모델링
    => 머리속의 복잡합 -> 가시적인 결과물
    => 무 -> 유
    => 무수히 많은 정리되지 않은 요구사항 -> 모두가 이해 가능하도록 구체적인 모습을 보여줌

==

데이터 용어 사전>
고객이름, 고객명/customer_nm, customer_name
=> 테이블명, 컬럼명 모두 개발자에게 명명 권한 부여하면 매우 지저분한 결과

논리적 모델링 단계에서 용어 사전 정의
=> 인터뷰 혹은 요구사항 정의서 등에서 파악된 모든 명사 쪼개서 등록
정리해서 ERD 도구에 등록, 개발자는 논리적 모델링 한글로, 물리 모델링 ERD 도구 영문으로 변경
3~5천개 정도 생성한다고 함

단일값 속성, 다중값 속성
일반 속성, 유도 속성, 저장 속성
나이는 속성으로 관리하지 않음 - 매년 업데이트를 해야하기 때문
카디널리티 - 관계 대응 수
1:1
1:다 - 가장 많음
다:다 - 관계형 db인 중간 관계 테이블 필요

Non-identifying(점선), identifying(실선)
약한 개체(=identifying?), 강한 개체(=Non-identifying?)

다중값 속성
개수가 확정된 거

구글폼 예상 ERD

회원 - 설문지; 재사용성에 대한 고민

회원>
회원 id
성별
전화번호
이메일

설문지>
설문지 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은 커플링이 심함

0개의 댓글