본문 바로가기
카테고리 없음

쿼리

by 두잇건강 2025. 8. 18.
반응형

1. 기존 Users 테이블 수정

-- 기존 users 테이블 수정 (기본 인증 정보만 유지)
ALTER TABLE users 
ADD COLUMN phone VARCHAR(20) NULL,
ADD COLUMN email_verified BOOLEAN DEFAULT FALSE,
ADD COLUMN phone_verified BOOLEAN DEFAULT FALSE,
ADD COLUMN status ENUM('ACTIVE', 'INACTIVE', 'SUSPENDED', 'PENDING') DEFAULT 'PENDING',
ADD COLUMN last_password_change TIMESTAMP NULL,
ADD COLUMN failed_login_attempts INT DEFAULT 0,
ADD COLUMN locked_until TIMESTAMP NULL,
ADD INDEX idx_users_status (status),
ADD INDEX idx_users_phone (phone);

2. 사용자 프로필 상세 정보 테이블

-- 사용자 프로필 상세 정보 테이블
CREATE TABLE user_profiles (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL UNIQUE,
    
    -- 개인 정보
    first_name VARCHAR(50) NULL,
    last_name VARCHAR(50) NULL,
    nickname VARCHAR(50) NULL,
    display_name VARCHAR(100) NULL,
    bio TEXT NULL,
    
    -- 생년월일 및 성별
    birth_date DATE NULL,
    gender ENUM('MALE', 'FEMALE', 'OTHER', 'PREFER_NOT_TO_SAY') NULL,
    
    -- 국적 및 언어
    nationality VARCHAR(50) NULL,
    preferred_language VARCHAR(10) DEFAULT 'ko',
    timezone VARCHAR(50) DEFAULT 'Asia/Seoul',
    
    -- 프로필 이미지
    profile_image_url VARCHAR(500) NULL,
    profile_image_filename VARCHAR(255) NULL,
    cover_image_url VARCHAR(500) NULL,
    cover_image_filename VARCHAR(255) NULL,
    
    -- 공개 설정
    profile_visibility ENUM('PUBLIC', 'FRIENDS_ONLY', 'PRIVATE') DEFAULT 'PUBLIC',
    show_email BOOLEAN DEFAULT FALSE,
    show_phone BOOLEAN DEFAULT FALSE,
    show_birth_date BOOLEAN DEFAULT FALSE,
    
    -- 타임스탬프
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    INDEX idx_user_profiles_user_id (user_id),
    INDEX idx_user_profiles_nickname (nickname),
    INDEX idx_user_profiles_display_name (display_name),
    COMMENT = '사용자 프로필 상세 정보 테이블'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

3. 사용자 주소 정보 테이블

-- 사용자 주소 정보 테이블 (다중 주소 지원)
CREATE TABLE user_addresses (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    
    -- 주소 타입
    address_type ENUM('HOME', 'WORK', 'BILLING', 'SHIPPING', 'OTHER') NOT NULL,
    is_default BOOLEAN DEFAULT FALSE,
    
    -- 주소 정보
    country VARCHAR(100) NOT NULL,
    state_province VARCHAR(100) NULL,
    city VARCHAR(100) NOT NULL,
    district VARCHAR(100) NULL,
    street_address TEXT NOT NULL,
    postal_code VARCHAR(20) NULL,
    
    -- 추가 정보
    address_label VARCHAR(100) NULL, -- 사용자 지정 라벨 (예: '우리집', '회사')
    recipient_name VARCHAR(100) NULL, -- 수령인 이름
    recipient_phone VARCHAR(20) NULL,
    
    -- 좌표 정보 (선택사항)
    latitude DECIMAL(10, 8) NULL,
    longitude DECIMAL(11, 8) NULL,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    INDEX idx_user_addresses_user_id (user_id),
    INDEX idx_user_addresses_type (address_type),
    INDEX idx_user_addresses_default (user_id, is_default),
    COMMENT = '사용자 주소 정보 테이블'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

4. 사용자 설정 테이블

-- 사용자 개별 설정 테이블
CREATE TABLE user_settings (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    
    -- 알림 설정
    email_notifications BOOLEAN DEFAULT TRUE,
    sms_notifications BOOLEAN DEFAULT TRUE,
    push_notifications BOOLEAN DEFAULT TRUE,
    marketing_emails BOOLEAN DEFAULT FALSE,
    
    -- 보안 설정
    two_factor_enabled BOOLEAN DEFAULT FALSE,
    login_notifications BOOLEAN DEFAULT TRUE,
    session_timeout_minutes INT DEFAULT 60,
    
    -- UI/UX 설정
    theme ENUM('LIGHT', 'DARK', 'SYSTEM') DEFAULT 'SYSTEM',
    language VARCHAR(10) DEFAULT 'ko',
    date_format VARCHAR(20) DEFAULT 'YYYY-MM-DD',
    time_format VARCHAR(10) DEFAULT '24H',
    
    -- 개인정보 설정
    data_sharing_consent BOOLEAN DEFAULT FALSE,
    analytics_tracking BOOLEAN DEFAULT TRUE,
    personalized_ads BOOLEAN DEFAULT FALSE,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    UNIQUE KEY uk_user_settings_user_id (user_id),
    COMMENT = '사용자 개별 설정 테이블'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

5. 소셜 미디어 연결 테이블

-- 소셜 미디어 계정 연결 테이블
CREATE TABLE user_social_accounts (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    
    -- 소셜 플랫폼 정보
    platform ENUM('GOOGLE', 'FACEBOOK', 'TWITTER', 'LINKEDIN', 'GITHUB', 'KAKAO', 'NAVER') NOT NULL,
    social_id VARCHAR(255) NOT NULL, -- 소셜 플랫폼의 사용자 ID
    social_email VARCHAR(255) NULL,
    social_username VARCHAR(255) NULL,
    
    -- 연결 상태
    is_verified BOOLEAN DEFAULT FALSE,
    is_primary BOOLEAN DEFAULT FALSE, -- 주 계정 여부
    
    -- 추가 정보
    access_token TEXT NULL,
    refresh_token TEXT NULL,
    token_expires_at TIMESTAMP NULL,
    
    -- 프로필 정보
    avatar_url VARCHAR(500) NULL,
    profile_url VARCHAR(500) NULL,
    
    connected_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    last_used_at TIMESTAMP NULL,
    
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    UNIQUE KEY uk_social_platform_id (platform, social_id),
    INDEX idx_user_social_user_id (user_id),
    INDEX idx_user_social_platform (platform),
    COMMENT = '소셜 미디어 계정 연결 테이블'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

6. 사용자 파일 관리 테이블

-- 사용자 파일 관리 테이블
CREATE TABLE user_files (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    
    -- 파일 기본 정보
    file_name VARCHAR(255) NOT NULL,
    original_name VARCHAR(255) NOT NULL,
    file_type ENUM('PROFILE_IMAGE', 'COVER_IMAGE', 'DOCUMENT', 'ATTACHMENT', 'OTHER') NOT NULL,
    mime_type VARCHAR(100) NOT NULL,
    file_size BIGINT NOT NULL, -- bytes
    
    -- 파일 경로 및 URL
    file_path VARCHAR(500) NOT NULL,
    file_url VARCHAR(500) NULL,
    thumbnail_url VARCHAR(500) NULL,
    
    -- 파일 상태
    upload_status ENUM('UPLOADING', 'COMPLETED', 'FAILED') DEFAULT 'UPLOADING',
    is_public BOOLEAN DEFAULT FALSE,
    
    -- 메타데이터
    alt_text VARCHAR(255) NULL,
    description TEXT NULL,
    tags JSON NULL,
    
    -- 이미지 전용 필드
    width INT NULL,
    height INT NULL,
    
    uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    INDEX idx_user_files_user_id (user_id),
    INDEX idx_user_files_type (file_type),
    INDEX idx_user_files_status (upload_status),
    COMMENT = '사용자 파일 관리 테이블'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

7. 사용자 활동 로그 테이블

-- 사용자 활동 로그 테이블
CREATE TABLE user_activity_logs (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    
    -- 활동 정보
    activity_type ENUM('LOGIN', 'LOGOUT', 'PROFILE_UPDATE', 'PASSWORD_CHANGE', 'EMAIL_CHANGE', 
                      'PHONE_CHANGE', 'ADDRESS_UPDATE', 'SETTINGS_CHANGE', 'FILE_UPLOAD', 
                      'SOCIAL_CONNECT', 'SOCIAL_DISCONNECT', 'ACCOUNT_VERIFICATION', 'OTHER') NOT NULL,
    activity_description TEXT NULL,
    
    -- 세부 정보
    changed_fields JSON NULL, -- 변경된 필드들
    old_values JSON NULL,     -- 이전 값들
    new_values JSON NULL,     -- 새로운 값들
    
    -- 접속 정보
    ip_address VARCHAR(45) NULL,
    user_agent TEXT NULL,
    device_type VARCHAR(50) NULL,
    browser VARCHAR(100) NULL,
    os VARCHAR(100) NULL,
    location VARCHAR(255) NULL,
    
    -- 결과
    is_success BOOLEAN DEFAULT TRUE,
    error_message TEXT NULL,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    INDEX idx_activity_logs_user_id (user_id),
    INDEX idx_activity_logs_type (activity_type),
    INDEX idx_activity_logs_created_at (created_at),
    INDEX idx_activity_logs_user_type (user_id, activity_type),
    COMMENT = '사용자 활동 로그 테이블'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

8. 사용자 선호도 테이블

-- 사용자 선호도 및 관심사 테이블
CREATE TABLE user_preferences (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    
    -- 선호도 카테고리
    category VARCHAR(100) NOT NULL, -- 예: 'interests', 'skills', 'hobbies', 'dietary'
    preference_key VARCHAR(100) NOT NULL,
    preference_value VARCHAR(255) NOT NULL,
    
    -- 가중치 및 우선순위
    weight DECIMAL(3,2) DEFAULT 1.00, -- 0.00 ~ 1.00
    priority INT DEFAULT 0,
    
    -- 메타데이터
    source ENUM('USER_INPUT', 'SYSTEM_INFERRED', 'IMPORTED', 'SURVEY') DEFAULT 'USER_INPUT',
    confidence_score DECIMAL(3,2) DEFAULT 1.00,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    UNIQUE KEY uk_user_preferences (user_id, category, preference_key),
    INDEX idx_user_preferences_user_id (user_id),
    INDEX idx_user_preferences_category (category),
    COMMENT = '사용자 선호도 및 관심사 테이블'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

9. 프로필 변경 히스토리 테이블

-- 프로필 변경 히스토리 테이블
CREATE TABLE profile_change_history (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    
    -- 변경 정보
    table_name VARCHAR(100) NOT NULL, -- 변경된 테이블명
    field_name VARCHAR(100) NOT NULL, -- 변경된 필드명
    old_value TEXT NULL,
    new_value TEXT NULL,
    
    -- 변경 사유
    change_reason VARCHAR(255) NULL,
    changed_by ENUM('USER', 'ADMIN', 'SYSTEM') DEFAULT 'USER',
    admin_user_id BIGINT NULL, -- 관리자가 변경한 경우
    
    -- 승인 관련
    requires_approval BOOLEAN DEFAULT FALSE,
    approval_status ENUM('PENDING', 'APPROVED', 'REJECTED') DEFAULT 'APPROVED',
    approved_by BIGINT NULL,
    approved_at TIMESTAMP NULL,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (admin_user_id) REFERENCES users(id) ON DELETE SET NULL,
    FOREIGN KEY (approved_by) REFERENCES users(id) ON DELETE SET NULL,
    INDEX idx_profile_history_user_id (user_id),
    INDEX idx_profile_history_table (table_name),
    INDEX idx_profile_history_approval (approval_status),
    COMMENT = '프로필 변경 히스토리 테이블'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

10. 초기 데이터 및 기본 설정

-- 사용자별 기본 프로필 및 설정 생성 트리거
DELIMITER //

CREATE TRIGGER after_user_insert 
AFTER INSERT ON users
FOR EACH ROW
BEGIN
    -- 기본 프로필 생성
    INSERT INTO user_profiles (user_id, display_name) 
    VALUES (NEW.id, COALESCE(NEW.name, NEW.email));
    
    -- 기본 설정 생성
    INSERT INTO user_settings (user_id) VALUES (NEW.id);
END//

DELIMITER ;

-- 기본 선호도 카테고리 데이터
INSERT INTO user_preferences (user_id, category, preference_key, preference_value, source)
SELECT id, 'system', 'account_created', NOW(), 'SYSTEM'
FROM users WHERE id IN (1, 2, 3);
반응형