# 테이블 설계 입력 및 판정 기준

## 입력

`validate_table_schema`는 다음 JSON 객체를 받는다.

`suggest_table_columns`는 기본값 `include_audit_columns=true`로 아래 감사 컬럼을 자동으로
추가한다. 특별한 분석 목적이 아니면 이 옵션을 끄지 않는다.

| 필드 | 필수 | 설명 |
|---|---:|---|
| `table_name` | 예 | 검증 대상 테이블명 |
| `korean_table_name` | strict 권고 | 논리 테이블명 |
| `description` | strict 권고 | 테이블 정의 |
| `profile` | 아니요 | `standard`(기본) 또는 `strict` |
| `columns` | 예 | 한 개 이상의 컬럼 배열 |
| `columns[].korean_name` | 조건부 | 논리 컬럼명. 영문명이 없으면 필수 |
| `columns[].english_name` | 조건부 | 물리 컬럼명. 논리명이 없으면 필수 |
| `columns[].domain_name` | strict 필수 | 활성 표준도메인명 |
| `columns[].description` | strict 권고 | 컬럼 정의 |
| `columns[].data_type` | 아니요 | DB 데이터타입 |
| `columns[].length` | 아니요 | 전체 길이 |
| `columns[].decimal_length` | 아니요 | 소수점 이하 길이 |
| `columns[].nullable` | 아니요 | NULL 허용 여부. 기본값 `true` |
| `columns[].primary_key` | 아니요 | 기본키 여부. 기본값 `false` |
| `columns[].unique` | 아니요 | 유일키 여부. 기본값 `false` |
| `columns[].indexed` | 아니요 | 인덱스 존재 여부. 기본값 `false` |
| `columns[].foreign_key` | 아니요 | `TABLE.COLUMN` 형식의 참조 대상 |

## 타입 정규화

- `VARCHAR2`, `NVARCHAR`, `NVARCHAR2`, `TEXT`는 `VARCHAR` 계열로 비교한다.
- `NUMBER`, `DECIMAL`, `INTEGER`, `INT`는 `NUMERIC` 계열로 비교한다.
- `DATE`, `TIMESTAMP`는 `DATETIME` 계열로 비교한다.
- 타입 별칭이 같더라도 길이와 소수점 길이는 별도로 비교한다.

## 판정

- `error`: 정확한 표준용어 없음, 물리명 불일치, 타입 불일치, 중복 컬럼, 도메인 없음
- `warning`: 데이터 길이 또는 소수점 길이 불일치
- `valid`: `error`가 0건인 경우. 경고는 수정 검토 대상으로 남긴다.

`strict`에서는 논리 테이블명의 활성 표준단어 영문약어를 조합하고 `TB_`를 붙인
대문자 스네이크 테이블명, 단일
`{table_name}_SN` 숫자형 PK와 NOT NULL, 활성 표준단어만으로 구성된 논리명, 마지막
형식단어, 활성 도메인, 논리명·물리명·타입을 필수 검사한다. 정의 설명과 외래키 인덱스는
경고로 검사한다. 이는 프로젝트 운영 규칙이며 공식 고시 규칙과 구분한다.

마지막 네 컬럼은 `등록일시`, `등록자아이디`, `수정일시`, `수정자아이디` 순서로 고정한다.
누락은 `audit_columns_required`, 순서 오류는 `audit_columns_order`, 약어·도메인·타입·길이
불일치는 `audit_column_definition_mismatch` 오류로 판정한다.

후보가 정확히 일치하지 않으면 `candidates`를 확인한 뒤 업무 의미를 사용자와 확정한다.
