Files
slot/docs/02-database-schema.md
chpark 0e549cad46 Initial import of slot-ss.com (gnuboard5 + Eyoom + YoungCart) for migration
Original PHP source rsync'd from production server (slot-ss.com) on 2026-04-27.
Excluded from import:
  - data/editor (74GB user uploads), data/file (8.5GB attachments)
  - data/member_image, vendor/, db100up/, caches/sessions/logs/tmp

Includes:
  - 11,636 files, ~206MB source code (gnuboard5 v5.6.6, Eyoom builder, YoungCart 4)
  - 28 plugins (bacara, chatbot, cron, swiunApi, sns, sms5, ...)
  - Active theme: eb4_maga_005 (Eyoom magazine layout)
  - Local Docker dev stack (PHP 7.4 + Apache + Redis + MariaDB) under docker/
  - PostgreSQL migration setup (pgloader configs) under db/
  - Architecture/migration docs under docs/

Single non-source patch: src/config.php now reads G5_DOMAIN_OVERRIDE env var
so the local Docker stack can serve at http://localhost:8088 without touching
the production constant. Falls back to https://slot-ss.com when unset.
2026-04-27 18:23:16 +09:00

161 lines
8.8 KiB
Markdown

# Database Schema — slot-ss.com
## 1. 두 개의 DB
| 이름 | 위치 (PG) | 크기 (MariaDB) | 테이블 | 용도 |
|------|-----------|----------------|--------|------|
| `inspection2` | `slot.inspection2.*` | 4 GB | 165 | **현재 운영 DB** |
| `inspection` | `slot_legacy.inspection.*` | 397 MB | 107 | **구버전 (레거시)** — 일부 데이터 포함 |
| `DomainCheck` | (마이그레이션 안 함) | 4 KB | — | 거의 빈 테이블, 무시 |
> 모든 테이블은 PostgreSQL 의 `inspection2` schema 안에 있다 (pgloader 가 MySQL DB 이름을 schema 이름으로 사용). 접근: `psql -h localhost -d slot -c "SET search_path TO inspection2; ..."`
## 2. 카테고리별 분포 (운영 DB 기준)
| 카테고리 | 테이블 수 | 사이즈 | 행 수 |
|----------|-----------|--------|------|
| 그누보드 코어 (`g5_*`) | 36 | 2.39 GB | 11.07M |
| 커스텀 (slot/casino/chatbot/sms/등) | 27 | 713 MB | 6.07M |
| 게시판 데이터 (`g5_write_*`) | 37 | 416 MB | 764K |
| 이윰 빌더 (`g5_eyoom_*`) | 38 | 222 MB | 914K |
| 영카트 쇼핑몰 (`g5_shop_*`) | 24 | 1.16 MB | 1.7K |
| 플러그인 (`g5_plugin_*`) | 3 | 4.7 MB | 10K |
## 3. 가장 큰 테이블 Top 20
| 테이블 | 행 수 | 사이즈 | 설명 |
|--------|-------|--------|------|
| `g5_point` | 5,950,013 | 1380 MB | 회원 포인트 적립/사용 내역 |
| `g5_visit` | 4,566,650 | 929 MB | 방문자 로그 (전체 페이지뷰) |
| `game_point` | 4,383,542 | 515 MB | **게임 포인트** (슬롯/바카라/룰렛 베팅 결과) |
| `g5_write_free` | 442,272 | 228 MB | 자유게시판 글+댓글 |
| `g5_eyoom_attendance` | 425,540 | 116 MB | 출석체크 |
| `g5_eyoom_activity` | 418,236 | 91 MB | 회원 활동 로그 |
| `games_table` | 303,238 | 53 MB | **슬롯 게임 마스터 테이블** |
| `g5_write_pick` | 17,189 | 44 MB | 픽게시판 |
| `g5_write_review` | 120,870 | 43 MB | 슬롯 후기게시판 |
| `g5_board_new` | 191,817 | 42 MB | 신규 게시글 인덱스 (캐시) |
| `blacklist_table` | 193,190 | 42 MB | **먹튀 블랙리스트 검색** |
| `writing_activity_bak` | 610,146 | 39 MB | 게시 활동 로그 백업 |
| `writing_activity` | 184,376 | 31 MB | 게시 활동 로그 (현재) |
| `check_table` | 359,644 | 26 MB | 검수/검증 로그 |
| `g5_uniqid` | 322,862 | 23 MB | 그누보드 unique ID 생성기 |
| `g5_write_humor` | 20,303 | 20 MB | 유머/이슈 게시판 |
| `g5_write_rear` | 18,022 | 20 MB | 후방게시판 |
| `g5_write_mukti` | 37,325 | 15 MB | 먹튀사이트 게시판 |
| `g5_write_lottery_ticket` | 45,724 | 13 MB | 슬생복권 응모 |
| `g5_write_fakesite` | 33,126 | 10 MB | 가품사이트 게시판 |
## 4. 운영 게시판 전체 (g5_board → 36개 + 게시판별 g5_write_* 테이블)
| bo_table | 제목 | 글 수 | 댓글 수 |
|----------|------|------|---------|
| free | 자유게시판 | 90,591 | 351,685 |
| lottery_ticket | 슬생복권 | 45,724 | 0 |
| humor | 유머/이슈 | 19,209 | 1,094 |
| rear | 후방게시판 | 17,650 | 374 |
| pick | 픽게시판 | 17,171 | 23 |
| review | 후기게시판 | 8,399 | 112,462 |
| gift_coupons | 기프티콘교환 | 4,693 | 0 |
| webtoon | (19금)번역망가 | 1,987 | 0 |
| mukti | 먹튀사이트 | 1,824 | 35,501 |
| fakesite | 가품사이트 | 1,517 | 31,609 |
| gift_exchanges | 기프티콘현황 | 1,404 | 1,398 |
| news | 카지노뉴스 | 1,055 | 3 |
| complaint | 먹튀신고 | 1,052 | 17 |
| ai | (19금)AI 사진 | 984 | 0 |
| slotche2 | 프라그마틱 | 614 | 0 |
| slotreview | 슬롯 리뷰 | 544 | 1 |
| slotche4 | 플레이엔고 | 394 | 0 |
| slotche6 | 하바네로 | 176 | 0 |
| slotche5 | 릴랙스게이밍 | 151 | 0 |
| slotche7 | CQ9 | 146 | 0 |
| slotche3,8,9,10,11,12 | (기타 슬롯제작사) | < 100 each | — |
| dividend, guarantee, event, notice, qa, column, reservation, inspection, guide | (각종 보조게시판) | — | — |
## 5. 회원 (g5_member) 핵심 컬럼
| 컬럼 | 타입 | 설명 |
|------|------|------|
| `mb_no` | bigint PK | 회원 일련번호 |
| `mb_id` | varchar | 로그인 ID |
| `mb_password` | varchar | bcrypt + (gnuboard 전용) salt 해시 |
| `mb_password2` | varchar | (구버전 호환) |
| `mb_nick` | varchar | 닉네임 |
| `mb_email` | varchar | 이메일 |
| `mb_level` | smallint | 권한 레벨 (1-12). **12 = 최고관리자** |
| `mb_point` | int | 보유 포인트 |
| `mb_today_login`, `mb_login_start`, `mb_login_ip` | — | 로그인 기록 |
| `mb_certify`, `mb_adult`, `mb_dupinfo` | — | 본인인증 (KCP / okname) |
| `mb_signature` | text | 회원 서명 |
| `mb_open` | smallint | 정보공개 여부 |
**현재 회원 수**: 3,064 명 / 관리자 4명 (`admin`, `admin2`(먹튀판사), `admin3`(슬생검증팀), `admin4`(슬생운영팀))
## 6. 핵심 테이블 카테고리 별 정리
### 6.1 그누보드 코어 (`g5_*`)
- `g5_member`, `g5_member_social_profiles`, `g5_member_cert_history`
- `g5_board`, `g5_board_file`, `g5_board_good`, `g5_board_new`
- `g5_group`, `g5_group_member`
- `g5_point` (포인트 원장), `g5_login` (현재 로그인), `g5_visit` / `g5_visit_sum` (방문통계)
- `g5_qa_config`, `g5_qa_content` (1:1문의)
- `g5_content`, `g5_faq`, `g5_faq_master`, `g5_menu`, `g5_new_win`, `g5_poll`, `g5_poll_etc`, `g5_popular`, `g5_scrap`, `g5_memo`, `g5_mail`, `g5_autosave`, `g5_uniqid`, `g5_auth`, `g5_config`, `g5_cert_history`
### 6.2 게시판 데이터 (`g5_write_*`)
한 게시판당 한 테이블 — 위 §4 표의 36개 게시판 × 각 `g5_write_<bo_table>`
### 6.3 이윰 빌더 (`g5_eyoom_*`)
대표:
- `g5_eyoom_member` (확장 회원정보), `g5_eyoom_attendance` (출석), `g5_eyoom_activity` (활동), `g5_eyoom_respond` (반응/공감)
- `g5_eyoom_banner`, `g5_eyoom_banner_item`, `g5_eyoom_banner_hit`
- `g5_eyoom_slider`, `g5_eyoom_slider_ytitem`
- `g5_eyoom_yellowcard` (경고/제재), `g5_eyoom_manager` (운영진)
- `g5_eyoom_tag`, `g5_eyoom_tag_write` (태그)
- `g5_eyoom_bbspoll`, `g5_eyoom_counsel`, `g5_eyoom_goods`, `g5_eyoom_rating`, `g5_eyoom_mbmemo`, `g5_eyoom_yellowcard`
### 6.4 영카트 쇼핑몰 (`g5_shop_*`)
- 거의 비어있음 (운영 미가동) — 현재 데이터 1.7K 행, 1MB
- `g5_shop_default`(설정), `g5_shop_item`(상품), `g5_shop_item_option`, `g5_shop_cart`(1559건), `g5_shop_order`, `g5_shop_order_data`, `g5_shop_coupon*`, `g5_shop_event*`, `g5_shop_personalpay`, `g5_shop_inicis_log`
### 6.5 커스텀 — 슬롯/카지노 도메인
| 테이블 | 용도 |
|--------|------|
| `game_point` | 게임 포인트 (슬롯/바카라/룰렛 베팅 결과 적립) |
| `games_table` | 슬롯 게임 마스터 (303K 게임 회차 추정) |
| `bacara_betting` | 바카라 베팅 로그 (7.9K건) |
| `swiun_betting` | Swiun 슬롯 API 베팅 로그 |
| `lottery_history` | 복권 응모/당첨 이력 |
| `event_point_exchange`, `point_exchange` | 포인트 환전/이벤트 |
| `slotbuff`, `slotbuff-category` | "슬롯버프" 기능 |
| `blacklist_table`, `blacklist_search` | 먹튀 블랙리스트 |
| `check_table`, `writing_activity*`, `writing_today` | 검증/활동 로그 |
| `chatbot_conversations`, `chatbot_feedback` | 챗봇 (AI 대화) |
| `officecon_products` | 기프티콘 |
| `ask_seo`, `ask_seo_url` | SEO 메타 |
| `sms5_book`, `sms5_book_group`, `sms5_config`, `sms5_form`, `sms5_form_group`, `sms5_history`, `sms5_write` | SMS 발송 시스템 |
## 7. 마이그레이션 시 주의사항
### 7.1 인덱스 손실
- pgloader 의 `preserve index names` 옵션과 **MySQL 의 동일-인덱스명 across-table 허용** 차이로 211개 인덱스 생성 실패 (PostgreSQL 은 schema 내 인덱스 이름 unique 필수).
- 다음 단계로 인덱스 이름을 `<table>_<index>` 형태로 자동 rename 후 재생성 필요. → `db/regen_indexes.sql` 스크립트로 작성 예정.
### 7.2 비밀번호 해시
- 그누보드5 `mb_password` 는 PHP `password_hash($pw, PASSWORD_BCRYPT)` 형식
- Node.js 신규 시스템에서 `bcrypt.compare()` 호환 가능 (즉, 회원 비밀번호 그대로 사용 가능)
### 7.3 한글 인덱스 이름 / 특수 컬럼
- `lottery_history` 테이블의 `복권 게시판 주키` 같이 한글 이름의 인덱스가 있음 — pgloader 가 quoting 실패. 신규 스키마에서는 영어로 rename.
### 7.4 BLOB / 첨부 메타
- 본문 첨부파일 메타는 `g5_board_file` 에 있고 실파일은 서버의 `/var/www/slot-ss.com/data/file/<bo_table>/<wr_id>/<file>` 에 저장
- 에디터 이미지: `data/editor/<YYMM>/<file>` — 74GB
- 신규 시스템에서는 S3 호환 오브젝트 스토리지로 이전 권장 (Cloudflare R2 / AWS S3 / MinIO)
### 7.5 ENUM/SET
- pgloader 는 `enum`/`set``text` 로 변환. 검증 로직은 신규 스키마에서 CHECK 제약 또는 PostgreSQL native enum 으로 재정의 권장
### 7.6 datetime/zerodate
- MySQL 의 `'0000-00-00 00:00:00'``using zero-dates-to-null` 로 NULL 변환됨. NOT NULL 제약은 모두 제거된 채로 들어왔음. 비즈니스 로직에서 NULL 허용을 검토할 것.