modam_core DB 테이블 스펙
- DB: MariaDB · InnoDB · utf8mb4
- 업무 데이터 7개 테이블 — 문서관리(app_doc) 6 + 일정관리(app_schedule) 1
- ※ Django 인증/세션(
auth_user등)은 별도 SQLite. 이 문서는modam_core의 업무 테이블만 다룬다. - 기준: 서버
modam_core실제 스키마(information_schema)
문서관리 (app_doc)
tb_board — 게시판 / 그룹 트리 (네비게이션)
| 컬럼 | 타입 | Null | 키 | 기본값 | 설명 |
|---|---|---|---|---|---|
| board_id | int | NO | PK | auto_inc | 게시판/그룹 고유번호 |
| parent_id | int | YES | 상위 그룹 board_id (NULL = 최상위) | ||
| name | varchar(200) | NO | 게시판/그룹 이름 | ||
| sort_order | int | NO | 0 | 같은 레벨에서의 정렬 순서 | |
| is_group | tinyint | NO | 0 | 1 = 글이 없는 그룹 헤더 | |
| is_favorite | tinyint | NO | 0 | 즐겨찾기(★) 표시 | |
| created_at | datetime | NO | now() | 생성 일시 |
설명 — 좌측 게시판 네비게이션의 2단 트리. is_group=1 인 그룹 아래에 하위 게시판이 parent_id 로 묶이고, 같은 레벨은 sort_order 로 정렬한다. 글이 있는 게시판/하위가 있는 그룹은 삭제 불가.
tb_doc — 문서 (글)
| 컬럼 | 타입 | Null | 키 | 기본값 | 설명 |
|---|---|---|---|---|---|
| doc_id | int | NO | PK | auto_inc | 문서 고유번호 |
| board_id | int | NO | idx | 소속 게시판 (ix_doc_board) | |
| title | varchar(300) | NO | 제목 | ||
| content_md | longtext | NO | 마크다운 원문 | ||
| content_html | longtext | NO | bleach 정제된 렌더 HTML | ||
| user_id | varchar(150) | YES | idx | 작성자 로그인 아이디(=auth_user.username) | |
| is_notice | tinyint | NO | 0 | 1 = 공지(목록 상단 고정) | |
| view_count | int | NO | 0 | 조회수 | |
| like_count | int | NO | 0 | 좋아요 수 | |
| status | varchar(1) | NO | idx | 'N' | 'N'=정상 / 'D'=소프트 삭제 |
| created_at | datetime | NO | now() | 작성 일시 | |
| updated_at | datetime | NO | now() | 수정 일시 |
설명 — 문서 본문. 마크다운 원문(content_md)과 렌더 HTML(content_html)을 함께 저장한다. 작성자는 숫자 FK가 아니라 로그인 아이디(username) 문자열로 저장(auth_user 는 SQLite 에 있어 크로스-DB 조인 회피). 삭제는 status='D' 소프트 삭제이며 기본 조회는 status!='D' 를 포함. 인덱스: ix_doc_board(board_id,status), ix_doc_status(status), ix_doc_user(user_id).
tb_tag — 태그 사전
| 컬럼 | 타입 | Null | 키 | 기본값 | 설명 |
|---|---|---|---|---|---|
| tag_id | int | NO | PK | auto_inc | 태그 고유번호 |
| name | varchar(100) | NO | UNIQUE | 태그명 (중복 불가) |
설명 — 문서에 붙이는 태그의 마스터. 이름은 UNIQUE 로 중복을 막고, 실제 문서 연결은 tb_doc_tag 로 한다.
tb_doc_tag — 문서 ↔ 태그 연결 (다대다)
| 컬럼 | 타입 | Null | 키 | 기본값 | 설명 |
|---|---|---|---|---|---|
| doc_id | int | NO | PK | 문서 번호 (복합 PK) | |
| tag_id | int | NO | PK | 태그 번호 (복합 PK) |
설명 — 문서와 태그의 N:M 매핑 테이블. (doc_id, tag_id) 복합 기본키로 같은 쌍의 중복을 방지한다.
tb_file — 첨부파일 메타
| 컬럼 | 타입 | Null | 키 | 기본값 | 설명 |
|---|---|---|---|---|---|
| file_id | int | NO | PK | auto_inc | 파일 고유번호 |
| doc_id | int | NO | idx | 소속 문서 (ix_file_doc) | |
| orig_name | varchar(255) | NO | 업로드 원본 파일명 | ||
| stored_name | varchar(255) | NO | 서버 저장 파일명 | ||
| size | int | NO | 0 | 파일 크기(바이트) | |
| uploaded_at | datetime | NO | now() | 업로드 일시 |
설명 — 문서 첨부파일의 메타데이터. 실제 파일 바이너리는 DB 가 아니라 media/attachments/<stored_name> 에 저장하고, 다운로드 시 orig_name 으로 내려준다.
tb_comment — 댓글 (스키마만, 현재 UI 미사용)
| 컬럼 | 타입 | Null | 키 | 기본값 | 설명 |
|---|---|---|---|---|---|
| comment_id | int | NO | PK | auto_inc | 댓글 고유번호 |
| doc_id | int | NO | idx | 소속 문서 (ix_comment_doc) | |
| user_id | varchar(150) | YES | idx | 작성자 로그인 아이디 (ix_comment_user) | |
| content | text | NO | 댓글 내용 | ||
| status | varchar(1) | NO | 'N' | 'N'=정상 / 'D'=소프트 삭제 | |
| created_at | datetime | NO | now() | 작성 일시 |
설명 — 문서 댓글용 테이블. 스키마는 정의돼 있으나 현재 화면에서는 아직 쓰지 않는다(검색의 댓글 범위 등 향후 확장 대비). 작성자·소프트삭제 규칙은 tb_doc 과 동일.
일정관리 (app_schedule)
tb_todo — 할 일 / 일정 (통합)
| 컬럼 | 타입 | Null | 키 | 기본값 | 설명 |
|---|---|---|---|---|---|
| todo_id | int | NO | PK | auto_inc | 고유번호 |
| content | text | NO | 내용(제목) | ||
| is_done | tinyint | NO | 0 | 완료(비반복 할 일) | |
| is_star | tinyint | NO | 0 | 별표(즐겨찾기) | |
| is_my_day | tinyint | NO | idx | 0 | '나의 하루' 여부 (ix_todo_myday) |
| my_day_date | varchar(10) | YES | 나의 하루로 지정한 날짜(YYYY-MM-DD) | ||
| due_date | varchar(10) | YES | idx | 기한(YYYY-MM-DD 문자열, ix_todo_due) | |
| remind_time | varchar(30) | YES | 미리 알림 시각(HH:MM, 24h) | ||
| repeat_unit | varchar(10) | YES | 반복 단위 day/week/month/year (NULL=안 함) | ||
| repeat_interval | int | NO | 1 | 반복 간격(N 단위마다) | |
| note | text | YES | 메모 | ||
| on_calendar | tinyint | NO | 0 | 1 = 달력에 일정으로 표시 | |
| is_todo | tinyint | NO | 1 | 1 = 할 일 목록 노출 (일정만 등록 시 0) | |
| created_at | datetime | NO | now() | 생성 일시 | |
| last_done_date | varchar(10) | YES | 반복 할 일의 현재 회차 완료일(회차별 완료 판정) | ||
| remind_day | varchar(10) | YES | 미리 알림 기준일 prev(전일)/same(당일) |
설명 — 일정관리의 유일한 테이블. 할 일과 일정을 분리하지 않고 플래그로 구분한다: is_todo(할 일 목록 노출) / on_calendar(달력 일정 표시) — 둘 다 1이면 동시, '일정만'은 is_todo=0. 반복은 발생일을 저장하지 않고 repeat_unit·repeat_interval 로 계산(mdl_recur)하며, 반복의 회차별 완료는 last_done_date 하나로 처리(그 회차 발생일보다 이르면 미완료). 날짜류(due_date·my_day_date·last_done_date)와 remind_time 은 문자열 비교(사전식=날짜순) 편의를 위해 VARCHAR 로 둔다.
공통 규칙 / 메모
- 삭제 = 소프트 삭제(
tb_doc.status='D'), 기본 조회는status != 'D'를 포함. - 작성자(user_id) 는 숫자 FK가 아니라 로그인 아이디(username) 문자열(mdmproj1 관례) — auth_user 가 SQLite 에 있어 크로스-DB 조인을 피함.
- 날짜/시각 일부 컬럼(
due_date·my_day_date·last_done_date·remind_time)은 문자열(VARCHAR) — 문자열 비교가 곧 날짜순이라 편의상 사용. - 스키마 추가는
init_schema의ALTER TABLE ... ADD COLUMN IF NOT EXISTS ...(idempotent)로 관리(예:last_done_date,remind_day).