kdrug-inventory-system/docs/한약재_정보_관리_시스템_설계.md
시골약사 7314c0075d docs: 데이터 구조 및 흐름 문서 완성
- 전체 시스템 데이터 흐름 문서 추가
- 테이블 관계 및 JOIN 경로 명확화
- ingredient_code 중심 설계 반영
- claude.md 메인 문서 추가
- 한약재 정보 관리 시스템 설계 문서 개선

주요 내용:
- 코드 체계 (성분코드 vs 보험코드) 설명
- 개선된 JOIN 구조 (5단계 → 3단계)
- 효능 태그 시스템 리팩토링 반영
- 개발 가이드 및 주의사항 포함
2026-02-17 03:26:37 +00:00

13 KiB

한약재 정보 관리 시스템 (K-Drug Information System)

1. 개요

1.1 목표

  • 양방약 DUR(Drug Utilization Review) 시스템처럼 한약재 정보를 체계적으로 관리
  • AI/API를 통한 지속적인 정보 업데이트
  • 근거 기반 한의학(Evidence-Based Korean Medicine) 데이터베이스 구축

1.2 벤치마킹

  • 건강보험심사평가원 의약품안전사용서비스(DUR)
  • KIMS (대한민국의약정보센터)
  • Micromedex (미국)
  • 한국한의학연구원 전통의학정보포털

2. 데이터베이스 설계

2.1 핵심 테이블 구조

-- 1. 약재 기본 정보 (확장)
CREATE TABLE herb_master_extended (
    herb_id INTEGER PRIMARY KEY,
    ingredient_code VARCHAR(10) UNIQUE,

    -- 기본 명칭
    name_korean VARCHAR(100) NOT NULL,
    name_hanja VARCHAR(100),
    name_latin VARCHAR(200),
    name_english VARCHAR(200),
    name_pharmaceutical VARCHAR(200),  -- 약전명

    -- 분류 정보
    family_latin VARCHAR(100),         -- 과명
    genus_species VARCHAR(200),        -- 학명
    origin_plant TEXT,                 -- 기원식물
    medicinal_part VARCHAR(100),       -- 약용부위

    -- 성미귀경
    property VARCHAR(50),              -- 성(性): 한/열/온/량/평
    taste VARCHAR(100),                -- 미(味): 고/감/산/신/함/담
    meridian_tropism TEXT,             -- 귀경: 입경 경락

    -- 효능 효과
    main_effects TEXT,                 -- 주요 효능
    indications TEXT,                  -- 적응증
    contraindications TEXT,            -- 금기증
    precautions TEXT,                  -- 주의사항

    -- 용법 용량
    dosage_range VARCHAR(50),          -- 상용량 (예: "3-12g")
    dosage_max VARCHAR(50),            -- 극량
    preparation_method TEXT,           -- 포제법

    -- 성분 정보
    active_compounds TEXT,             -- 주요 성분
    chemical_constituents JSON,        -- 화학 성분 상세 (JSON)

    -- 약리 작용
    pharmacological_effects TEXT,      -- 약리작용
    clinical_applications TEXT,        -- 임상응용

    -- 상호작용
    drug_interactions JSON,            -- 약물 상호작용 (JSON)
    food_interactions JSON,            -- 음식 상호작용 (JSON)

    -- 품질 기준
    quality_standards TEXT,            -- 품질 기준
    identification_method TEXT,        -- 감별법

    -- 메타데이터
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    data_source VARCHAR(100),         -- 데이터 출처
    reliability_score INTEGER,        -- 신뢰도 점수 (1-10)
    review_status VARCHAR(20)         -- 검토 상태
);

-- 2. 약재 연구 문헌
CREATE TABLE herb_research_papers (
    paper_id INTEGER PRIMARY KEY,
    ingredient_code VARCHAR(10),  -- 성분코드 직접 사용 (개선)

    title TEXT NOT NULL,
    authors TEXT,
    journal VARCHAR(200),
    publication_year INTEGER,
    volume VARCHAR(50),
    pages VARCHAR(50),

    doi VARCHAR(100),
    pubmed_id VARCHAR(20),

    abstract TEXT,
    keywords TEXT,

    study_type VARCHAR(50),           -- RCT, 관찰연구, 리뷰 등
    evidence_level INTEGER,            -- 근거수준 (1-5)

    findings TEXT,                     -- 주요 발견
    clinical_relevance TEXT,           -- 임상적 의미

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    indexed_at TIMESTAMP
);

-- 3. 약재 안전성 정보
CREATE TABLE herb_safety_info (
    safety_id INTEGER PRIMARY KEY,
    ingredient_code VARCHAR(10),  -- 성분코드 직접 사용 (개선)

    -- 독성 정보
    toxicity_level VARCHAR(20),       -- 독성 등급
    ld50_value VARCHAR(50),           -- 반수치사량
    toxic_compounds TEXT,              -- 독성 성분

    -- 부작용
    common_side_effects TEXT,          -- 흔한 부작용
    rare_side_effects TEXT,           -- 드문 부작용
    serious_adverse_events TEXT,      -- 중대 이상반응

    -- 특수 집단
    pregnancy_category VARCHAR(10),    -- 임신 등급
    pregnancy_safety TEXT,             -- 임신 안전성
    lactation_safety TEXT,            -- 수유 안전성
    pediatric_use TEXT,               -- 소아 사용
    geriatric_use TEXT,               -- 노인 사용

    -- 모니터링
    monitoring_parameters TEXT,        -- 모니터링 항목
    laboratory_tests TEXT,            -- 필요 검사

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 4. 처방 구성 규칙
CREATE TABLE prescription_rules (
    rule_id INTEGER PRIMARY KEY,

    -- 배합 규칙 (성분코드 사용으로 개선)
    ingredient_code_1 VARCHAR(10),
    ingredient_code_2 VARCHAR(10),
    relationship_type VARCHAR(50),     -- 상수/상사/상외/상오/상쇄/상반/상살

    description TEXT,
    clinical_significance TEXT,
    evidence_source TEXT,

    severity_level INTEGER,            -- 심각도 (1-5)
    action_required VARCHAR(50),       -- 조치사항

    is_absolute BOOLEAN,              -- 절대 금기 여부

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 5. 질병-약재 매핑
CREATE TABLE disease_herb_mapping (
    mapping_id INTEGER PRIMARY KEY,

    disease_code VARCHAR(20),          -- KCD 코드
    disease_name VARCHAR(200),
    herb_id INTEGER REFERENCES herb_master_extended(herb_id),

    indication_type VARCHAR(50),       -- 주적응증/부적응증
    evidence_level INTEGER,            -- 근거수준
    recommendation_grade VARCHAR(10),   -- 권고등급

    clinical_notes TEXT,
    references TEXT,

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 6. AI/API 업데이트 로그
CREATE TABLE data_update_logs (
    log_id INTEGER PRIMARY KEY,

    update_type VARCHAR(50),           -- AI/API/MANUAL
    source VARCHAR(100),               -- 데이터 소스
    target_table VARCHAR(50),
    target_id INTEGER,

    before_data JSON,                  -- 변경 전 데이터
    after_data JSON,                   -- 변경 후 데이터

    update_reason TEXT,
    confidence_score FLOAT,            -- AI 신뢰도

    is_reviewed BOOLEAN DEFAULT FALSE,
    reviewed_by VARCHAR(50),
    review_notes TEXT,

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

3. API/AI 연동 방안

3.1 외부 데이터 소스

국내 소스

  • 한국한의학연구원 API

    • 한약재 데이터베이스
    • 처방 데이터베이스
    • 임상 연구 자료
  • 건강보험심사평가원

    • 한약제제 급여 정보
    • 안전성 정보
  • 식품의약품안전처

    • 한약재 품질 기준
    • 안전성 정보

국제 소스

  • PubMed API

    • 한약재 연구 논문
    • 임상시험 결과
  • WHO Traditional Medicine

    • 국제 표준 정보
    • 안전성 데이터
  • ClinicalTrials.gov

    • 진행 중인 임상시험

3.2 AI 활용 방안

# AI 기반 정보 추출 및 업데이트 예시

class HerbInfoAIUpdater:
    def __init__(self):
        self.nlp_model = load_korean_medical_nlp()
        self.ocr_model = load_medical_ocr()

    def extract_from_literature(self, pdf_path):
        """의학 문헌에서 약재 정보 추출"""
        text = self.ocr_model.extract_text(pdf_path)

        entities = self.nlp_model.extract_entities(text, types=[
            'HERB_NAME',
            'DOSAGE',
            'INDICATION',
            'CONTRAINDICATION',
            'SIDE_EFFECT',
            'INTERACTION'
        ])

        return self.validate_and_structure(entities)

    def update_from_clinical_data(self, clinical_records):
        """임상 데이터에서 패턴 분석"""
        # 처방 패턴 분석
        prescription_patterns = self.analyze_prescription_patterns(clinical_records)

        # 효능 검증
        efficacy_data = self.validate_efficacy(clinical_records)

        # 안전성 모니터링
        safety_signals = self.detect_safety_signals(clinical_records)

        return {
            'patterns': prescription_patterns,
            'efficacy': efficacy_data,
            'safety': safety_signals
        }

    def cross_reference_validation(self, herb_info):
        """교차 검증"""
        sources = [
            self.query_kmri_api(herb_info['name']),
            self.query_pubmed(herb_info['latin_name']),
            self.query_who_database(herb_info['code'])
        ]

        return self.reconcile_information(sources)

4. 기능 구현

4.1 약재 정보 조회 API

@app.route('/api/herbs/<int:herb_id>/full-info', methods=['GET'])
def get_herb_full_info(herb_id):
    """약재 종합 정보 조회"""
    return {
        'basic_info': get_basic_info(herb_id),
        'pharmacology': get_pharmacology(herb_id),
        'safety': get_safety_info(herb_id),
        'interactions': get_interactions(herb_id),
        'research': get_research_papers(herb_id),
        'clinical_use': get_clinical_applications(herb_id)
    }

@app.route('/api/herbs/search', methods=['POST'])
def search_herbs_advanced():
    """고급 검색"""
    criteria = request.json

    # 증상으로 검색
    if criteria.get('symptoms'):
        return search_by_symptoms(criteria['symptoms'])

    # 성분으로 검색
    if criteria.get('compounds'):
        return search_by_compounds(criteria['compounds'])

    # 처방 호환성 검색
    if criteria.get('compatibility'):
        return check_prescription_compatibility(criteria['herbs'])

4.2 안전성 검증 시스템

class HerbSafetyChecker:
    def check_prescription_safety(self, herbs, patient_info):
        """처방 안전성 종합 검증"""

        results = {
            'is_safe': True,
            'warnings': [],
            'contraindications': [],
            'interactions': [],
            'dosage_alerts': []
        }

        # 1. 약재 간 상호작용 확인
        for herb1, herb2 in combinations(herbs, 2):
            interaction = self.check_herb_interaction(herb1, herb2)
            if interaction:
                results['interactions'].append(interaction)

        # 2. 환자 특성별 금기 확인
        if patient_info.get('pregnancy'):
            self.check_pregnancy_safety(herbs, results)

        if patient_info.get('allergies'):
            self.check_allergy_risk(herbs, patient_info['allergies'], results)

        # 3. 용량 검증
        self.validate_dosages(herbs, results)

        # 4. 질병-약물 상호작용
        if patient_info.get('conditions'):
            self.check_disease_interactions(herbs, patient_info['conditions'], results)

        return results

4.3 데이터 품질 관리

class DataQualityManager:
    def validate_herb_data(self, herb_data):
        """데이터 품질 검증"""

        scores = {
            'completeness': self.check_completeness(herb_data),
            'accuracy': self.verify_accuracy(herb_data),
            'consistency': self.check_consistency(herb_data),
            'timeliness': self.check_timeliness(herb_data)
        }

        herb_data['quality_score'] = sum(scores.values()) / len(scores)
        herb_data['quality_details'] = scores

        return herb_data

    def reconcile_conflicts(self, data_sources):
        """데이터 충돌 해결"""

        # 신뢰도 기반 가중 평균
        weighted_data = {}
        for source in data_sources:
            weight = source['reliability_score']
            for field, value in source['data'].items():
                if field not in weighted_data:
                    weighted_data[field] = []
                weighted_data[field].append((value, weight))

        # 최종 값 결정
        final_data = {}
        for field, values in weighted_data.items():
            final_data[field] = self.select_best_value(values)

        return final_data

5. 사용자 인터페이스

5.1 약재 정보 대시보드

  • 약재 상세 정보 카드
  • 효능/효과 시각화
  • 안전성 정보 알림
  • 연구 논문 목록
  • 처방 활용 통계

5.2 처방 안전성 검증

  • 실시간 DUR 체크
  • 약재 조합 검증
  • 용량 적정성 평가
  • 환자별 맞춤 알림

5.3 지식 관리 도구

  • 새로운 연구 결과 알림
  • 데이터 품질 모니터링
  • AI 제안 검토
  • 전문가 협업 도구

6. 구현 로드맵

Phase 1: 기반 구축 (1-2개월)

  • 확장 데이터베이스 스키마 구현
  • 기본 CRUD API 개발
  • 데이터 마이그레이션

Phase 2: 외부 연동 (2-3개월)

  • 한의학연구원 API 연동
  • PubMed API 연동
  • 자동 업데이트 스케줄러

Phase 3: AI 통합 (3-4개월)

  • NLP 모델 훈련
  • 문헌 자동 분석
  • 패턴 인식 시스템

Phase 4: 안전성 시스템 (2개월)

  • DUR 체크 시스템
  • 실시간 경고 시스템
  • 보고서 생성

Phase 5: 고도화 (지속)

  • 사용자 피드백 수집
  • 모델 개선
  • 새로운 데이터 소스 추가

7. 기대 효과

  1. 근거 기반 처방

    • 최신 연구 결과 반영
    • 객관적 데이터 기반 의사결정
  2. 환자 안전성 향상

    • 실시간 안전성 검증
    • 부작용 예방
  3. 업무 효율성

    • 자동화된 정보 관리
    • 빠른 정보 검색
  4. 지식 축적

    • 체계적인 데이터베이스
    • 지속적인 학습 시스템
  5. 표준화

    • 한약재 정보 표준화
    • 품질 관리 체계화