# [2단계] 데이터베이스 설계 (DB Design & ERD) 본 문서는 누수 시험 시스템에서 취급하는 계측 데이터 및 로그인 사용자 계정 정보를 관리하기 위한 MSSQL 데이터베이스 설계를 정의합니다. --- ## 1. 개체 및 관계 정의 (Entity Relationship Summary) 본 시스템은 단독 장비가 아닌 다수 지그(Jig)와 채널(Left/Right)에서 생산되는 검사 데이터를 수집하므로, 다음의 핵심 엔티티를 관리합니다. * **Users (사용자 계정)**: 장비를 조작하는 작업자(Operator) 또는 관리자 계정 정보. * **EOL (검사 결과 이력)**: 제품의 누수 시험 최종 결과 데이터로, 제품 ID/ADLINK 센서로부터 읽어들인 `IC_SN`을 주 식별자로 사용합니다. * **SystemConfigs (장비 설정 캐시)**: 프로그램의 상/하한 스펙(SpecUL/LL) 및 통신 포트 옵션 이력. --- ## 2. 테이블 명세서 (Table Specification) ### 2.1 Users (사용자 정보 테이블) * **설명**: 장비 로그인 및 조작을 인가받은 사용자 계정을 저장합니다. * **테이블명**: `[dbo].[Users]` | 컬럼명 | 데이터 타입 | Null 여부 | 제약조건 | 설명 | | :--- | :--- | :--- | :--- | :--- | | **OperatorId** | `VARCHAR(50)` | NOT NULL | PK | 작업자 고유 식별 아이디 (로그인 ID) | | **Password** | `VARCHAR(256)` | NOT NULL | - | 단방향 해시화된 비밀번호 (또는 레거시 대조용 암호) | | **OperatorName**| `NVARCHAR(50)` | NULL | - | 작업자 실명 | | **Role** | `VARCHAR(20)` | NOT NULL | DEFAULT 'OPERATOR' | 사용자 권한 (`ADMIN`, `OPERATOR`, `DEVELOPER`) | | **CreatedAt** | `DATETIME` | NOT NULL | DEFAULT GETDATE()| 계정 등록 일시 | ### 2.2 EOL (검사 데이터 저장 테이블) * **설명**: 최종 EOL(End of Line) 누수 검사 결과를 기록합니다. 제품 바코드(`IC_SN`)를 기준으로 UPSERT(MERGE) 처리됩니다. * **테이블명**: `[dbo].[EOL]` | 컬럼명 | 데이터 타입 | Null 여부 | 제약조건 | 설명 | | :--- | :--- | :--- | :--- | :--- | | **IC_SN** | `VARCHAR(50)` | NOT NULL | PK | 센서에서 판독한 16자리 제품 고유 시리얼 번호 | | **PCB_Barcode** | `VARCHAR(50)` | NOT NULL | - | 인쇄 회로 기판(PCB) 바코드 (식별 불가 시 `-` 처리) | | **Maker** | `NVARCHAR(50)` | NULL | - | 제조사 식별 정보 | | **Model** | `NVARCHAR(50)` | NULL | - | 검사 대상 모델 코드 | | **Variant_1** | `NVARCHAR(50)` | NULL | - | 파생 기종 식별 속성 1 | | **Variant_2** | `NVARCHAR(50)` | NULL | - | 파생 기종 식별 속성 2 | | **Operator** | `VARCHAR(50)` | NOT NULL | FK (Users.OperatorId) | 검사를 진행한 로그인 작업자 ID | | **Production_Date**| `DATETIME` | NOT NULL | DEFAULT GETDATE() | 검사 수행 완료 일시 | | **Line** | `NVARCHAR(30)` | NULL | - | 생산 라인 번호 / 명칭 | | **Lot_No** | `NVARCHAR(50)` | NULL | - | 작업 지시 묶음 번호 (Lot Number) | | **Jig_No** | `NVARCHAR(20)` | NULL | - | 검사에 사용된 지그(Jig) 번호 | | **Channel** | `VARCHAR(10)` | NOT NULL | - | 검사 물리 채널 명칭 (`LEFT`, `RIGHT`) | | **Spec_UL** | `DECIMAL(10, 4)`| NOT NULL | - | 합격 스펙 상한치 (Upper Limit) | | **Spec_LL** | `DECIMAL(10, 4)`| NOT NULL | - | 합격 스펙 하한치 (Lower Limit) | | **Leak_Value** | `DECIMAL(10, 4)`| NOT NULL | - | 센서에서 최종 파싱된 실측 누설값 | | **Result** | `VARCHAR(5)` | NOT NULL | CHECK (in ('OK', 'NG'))| 합격(`OK`) 또는 불합격(`NG`) 판정 | --- ## 3. 엔티티 관계도 (Entity Relationship Diagram - ERD) `EOL` 검사 이력은 `Users` 테이블의 작업자 고유 ID(`OperatorId`)를 외래키(`Operator`)로 참조하여, 어떤 작업자가 어떤 검사 이력을 남겼는지에 대한 일대다(1:N) 식별 및 추적이 가능합니다. ```mermaid erDiagram USERS { VARCHAR_50 OperatorId PK "작업자 ID" VARCHAR_256 Password "비밀번호" NVARCHAR_50 OperatorName "작업자 실명" VARCHAR_20 Role "권한 (ADMIN/OPERATOR)" DATETIME CreatedAt "계정 생성일시" } EOL { VARCHAR_50 IC_SN PK "제품 시리얼 번호" VARCHAR_50 PCB_Barcode "PCB 바코드" NVARCHAR_50 Maker "제조사" NVARCHAR_50 Model "모델명" NVARCHAR_50 Variant_1 "속성 1" NVARCHAR_50 Variant_2 "속성 2" VARCHAR_50 Operator FK "작업자 ID" DATETIME Production_Date "검사 완료일시" NVARCHAR_30 Line "생산 라인" NVARCHAR_50 Lot_No "로트 번호" NVARCHAR_20 Jig_No "지그 번호" VARCHAR_10 Channel "채널 (LEFT/RIGHT)" DECIMAL Spec_UL "스펙 상한치" DECIMAL Spec_LL "스펙 하한치" DECIMAL Leak_Value "실측 누출량" VARCHAR_5 Result "판정 (OK/NG)" } USERS ||--o{ EOL : "performs" ``` --- ## 4. 데이터 정합성 유지 전략 (Data Integrity & Optimization) * **UPSERT 쿼리 이중화**: 제품 시리얼 `IC_SN`은 고유하므로, 동일 제품이 재검사(Retest)되거나 지연 전송되었을 경우 중복 릴레이션이 맺어지지 않도록 `MERGE` 구문을 활용해 기존 검사 행을 업데이트(UPDATE)하고 신규일 때만 신규 행을 삽입(INSERT)합니다. * **인덱스(Index) 설계 전략**: * **Clustered Index**: 데이터가 생성순서에 따라 밀집되도록 `Production_Date`를 포함하거나 주 키인 `IC_SN`에 적용합니다. * **Non-Clustered Index**: 작업 이력 대량 조회(`DataView`)의 검색 속도 최적화를 위해 복합 인덱스 `IX_EOL_Search (Production_Date, Result, Lot_No)` 구성을 제안합니다.