Aller au contenu

CCAM Database Structure - Complete Documentation

This document describes the complete structure of the CCAM (Classification Commune des Actes Médicaux) database exported as DBF files.

Overview

The CCAM is a comprehensive medical coding and billing system for French healthcare, containing: - 83,025 medical procedures - 1.3M business rule relationships - 788K pricing records - 72 interconnected tables


1. CORE HIERARCHY (3 Levels)

Level 1: ACTE (Medical Procedures)

File: R_ACTE.dbf (83,025 records)

The root entity representing medical procedures.

Primary Key: COD_ACTE (13 chars) + DT_MODIF (date)

Fields: - Identity: - COD_ACTE: Procedure code (13 chars) - COD_STRUCT: Structured hierarchical code - Names: - NOM_COURT: Short name (70 chars) - NOM_LONG + NOM_LONG0 through NOM_LONGE: Long description (~3,800 chars total, split due to DBF 254-char field limit) - Classification: - MENU_COD → R_MENU: Hierarchical classification tree - TYPE_COD → R_TYPE: Procedure type (3 types) - Financial: - FRAIDP_COD → R_FRAIS_DEP: Travel expenses (4 types) - REMBOU_COD → R_REMBOURSEMENT: Reimbursement mode (3 types) - Versioning: - PRECEDENT: Previous version of procedure code - SUIVANT: Next version of procedure code - DT_CREATIO: Creation date - DT_FIN: End date (if obsolete) - DT_EFFET: Effective date - DT_ARRETE: Decree date - DT_JO: Official journal publication date - Constraints: - SEXE: Gender restriction (0=both, 1=male, 2=female) - ENTENTE: Prior agreement required (Y/N) - PMSI: - MFIC_PLACE: Position in medical information file

Example:

COD_ACTE: GDFE005
NOM_COURT: résec/section des plis aryépiglottiques laryngo sans laser
NOM_LONG: Résection ou section des plis aryépiglottiques, par laryngoscopie directe sans laser


Level 2: ACTIVITE (Activity Context)

File: R_ACTE_IVITE.dbf (137,623 records)

Activities represent specific contexts for performing procedures (e.g., surgical vs. anesthesia).

Code: AA_CODE (14 chars) = ACTE_COD + ACTIV_COD

Fields: - COD_AA: Activity code (14 chars) - ACTE_COD + ACDT_MODIF: Link to ACTE - ACTIV_COD → R_ACTIVITE: Activity type - '1' = "1° activité chir/med" (primary surgical/medical) - '4' = "anesthésie" (anesthesia) - (5 types total) - REGROU_COD → R_REGROUPEMENT: Grouping code (44 groups like 'ADC', 'ADA') - CATMED_COD → R_CATEGORIE_MEDIC: Medical category (8 categories)

Example:

COD_AA: DGPA0161
ACTE_COD: DGPA016
ACTIV_COD: 1
REGROU_COD: ADC


Level 3: ACTIVITE_PHASE (Pricing/Execution Unit)

File: R_ACTE_IVITE_PHASE.dbf (137,884 records)

The detailed pricing and execution level.

Code: AAP_COD (16 chars) = AA_CODE + PHASE_COD

Fields: - COD_AAP: Activity-phase code (16 chars) - AA_COD + AADT_MODIF: Link to ACTIVITE - PHASE_COD → R_PHASE: Phase type (4 phases) - Work Unit: - UOEUVR_COD + UOEDT_EFFE → R_UNITE_OEUVRE: Work unit definition and value - Payment: - PAIEM_COD → R_PAIEMENT: Payment mode (6 modes) - Pricing Components: - COEFFICIEN: Multiplier coefficient - PU_BASE: Base unit price - SUPPLEMENT: Additional charge - Constraints: - AGE_MIN, AGE_MAX: Age restrictions - NB_SEANCES: Number of sessions - NB_DENTS: Number of teeth (dental procedures) - Scoring: - SCORE: Procedure score - PRATIQUE: Practice score - ICR: Resource consumption index


2. PRICING SYSTEM

R_PU_BASE (774,338 records)

Multi-tariff grid pricing system.

Fields: - AAP_COD: Activity-phase code - GRILLE_COD: Pricing grid identifier (allows multiple pricing schemes) - PU_BASE: Base unit price - APDT_MODIF: Modification date

Purpose: Same activity-phase can have different prices depending on the pricing grid (region, insurance type, etc.)


R_AAP_PMSI (13,749 records)

PMSI (Programme de Médicalisation des Systèmes d'Information) integration.

Fields: - AAP_COD: Activity-phase code - ICR: Resource consumption index - CLASSANT: Classification flag

Purpose: Integration with hospital information systems for DRG-like classification.


3. BUSINESS RULES

R_ASSOCIATIONS (1,205,159 records)

Defines which activity combinations are ALLOWED and how they affect pricing.

Fields: - AA_CODE1 + DT_MODIF1: First activity - AA_CODE2 + DT_MODIF2: Second activity - REGLE_COD → R_TB03: Association rule (20 rule types)

Purpose: When two procedures are performed together, this defines if it's allowed and what coefficient to apply.


R_INCOMPATIBILITES (107,437 records)

Defines which procedure combinations are FORBIDDEN.

Fields: - ACTE_COD1 + DT_MODIF1: First procedure - ACTE_COD2 + DT_MODIF2: Second procedure

Purpose: Mutual exclusions (procedures that cannot be billed together).


R_PROCEDURE (11,539 records)

Related procedure relationships.

Fields: - ACTE_COD + ACDT_MODIF: Source procedure - PROC_COD + PRDT_MODIF: Related procedure

Purpose: Links procedures that are related (e.g., follow-up procedures, alternative approaches).


4. MODIFIERS & EXTENSIONS

R_ACTIVITE_MODIFICATEUR (471,273 records)

Pricing modifiers that can be applied to activities.

Fields: - AA_CODE + AADT_MODIF: Activity code - MODIFI_COD → R_TB11: Modifier code


R_TB11 (554 records)

Modifier definitions with pricing impacts.

Fields: - COD_MODIFI: Modifier code (1 char) - LIBELLE: Description - COEF: Coefficient multiplier - FORFAIT: Flat fee amount - GRILLE_COD: Pricing grid - DT_DEBUT, DT_FIN: Temporal validity

Purpose: Defines situation-specific pricing adjustments (emergency, night shift, etc.).


R_ACTIVITE_EXTENSION (5 records)

Activity extensions.

Fields: - AA_COD: Activity code - EXTENS_COD → R_EXTENSION: Extension type (3 types)


5. CONTEXT & ELIGIBILITY

R_ACTIVITE_EXECUTANT (144,275 records)

Defines WHO can perform each activity.

Fields: - AA_COD + AADT_MODIF: Activity code - CATSPE_COD → R_CATE_SPEC: Specialty category (5 categories)

Purpose: Restricts activities to qualified healthcare professionals.


R_ACTE_PRESCRIPTEUR (91,347 records)

Defines WHO can prescribe each procedure.

Fields: - ACTE_COD + ACDT_MODIF: Procedure code - CATSPE_COD → R_CATE_SPEC: Specialty category

Purpose: Restricts prescribing authority.


R_ACTE_NAT_ASS (33,915 records)

Insurance nature restrictions.

Fields: - ACTE_COD: Procedure code - NATASS_COD → R_NAT_ASS: Insurance nature (8 types)

Purpose: Defines which insurance types cover which procedures.


R_ACTE_EXO_TM (84,975 records)

Tax exemption rules.

Fields: - ACTE_COD + ACDT_MODIF: Procedure code - EXOTM_COD → R_EXO_TM: Exemption type (6 types)

Purpose: Defines tax exemptions for certain medical procedures.


R_COMPAT_EXO_TM (5 records)

Compatibility rules between exemption types.

Fields: - EXOTM_COD1: First exemption - EXOTM_COD2: Second exemption

Purpose: Defines which exemptions can be combined.


R_ACTE_FORFAIT (1,438 records)

Package/bundle associations.

Fields: - ACTE_COD + ACDT_MODIF: Procedure code - FORFAI_COD → R_FORFAIT: Package type (5 types)

Purpose: Procedures that are part of bundled payment packages.


R_ACTE_CMUC (910 records)

Universal Health Coverage (Couverture Maladie Universelle Complémentaire) special pricing.

Fields: - CLE_FORFAI: Package key - ACTE_COD + MODIF_DT: Procedure code

Purpose: Special pricing rules for universal health coverage beneficiaries.


R_ACTE_COND_GEN (8,533 records)

General conditions for procedure execution.

Fields: - ACTE_COD: Procedure code - CONDGE_COD → R_COND_GEN: Condition code (4 conditions)


R_COND_GEN (4 records)

General condition definitions.

Fields: - COD_CONDGE: Condition code - LIBELLE + LIBELLE0 through LIBELLEE: Long text description (~4,000 chars)

Purpose: Detailed textual conditions for procedure execution (medical protocols, safety requirements).


6. DOMAIN-SPECIFIC EXTENSIONS

R_ACTIVITE_PHASE_DENT (16,322 records)

Dental-specific: tooth position restrictions.

Fields: - AAP_COD: Activity-phase code - DEN_NUMERO → R_DENT: Tooth position (64 positions in dental notation)

Purpose: Specifies which teeth a dental procedure applies to.


R_DENT (64 records)

Tooth position reference table.

Fields: - NUMERO_DEN: Tooth number - LIBELLE: Tooth description


R_ACTIVITE_PHASE_DOM (551,536 records)

Medical domain majorations (pricing adjustments).

Fields: - AAP_COD + APDT_MODIF: Activity-phase code - DOM_COD → R_DOM: Domain code (4 domains) - MAJORATION: Price increase factor

Purpose: Domain-specific pricing adjustments (e.g., pediatrics, geriatrics).


R_DOM (4 records)

Medical domain reference table.

Fields: - COD_DOM: Domain code - LIBELLE: Domain description


7. DOCUMENTATION SYSTEM

R_NOTE_ACTE (40,930 records)

Rich text annotations for procedures.

Fields: - ACTE_COD + ACDT_MODIF: Procedure code - ORDRE_NOTE: Note sequence number - TYPNOT_COD → R_TYPE_NOTE: Note type (17 types) - TEXTE_NOTE + TEXTE_NOT0 through TEXTE_NOTF: Note text (~4,000 chars) - RENVOI_COD: Cross-reference to another procedure

Purpose: Clinical notes, billing instructions, contraindications, etc.


R_NOTE_MENU (995 records)

Notes attached to menu classification nodes.

Fields: Same structure as R_NOTE_ACTE - MENU_COD: Menu node code


R_TYPE_NOTE (17 records)

Note type definitions.

Fields: - COD_TYPNOT: Note type code - LIBELLE: Description

Examples: Clinical indications, contraindications, billing notes, technical requirements.


R_GLOSSAIRE (9,709 records)

Medical terminology dictionary.

Fields: - LIBELLE: Term (50 chars) - DEFINITION: Definition (254 chars)

Purpose: Definitions of medical terms used throughout the database.


8. CLASSIFICATION TREE

R_MENU (1,725 records)

Hierarchical classification tree for organizing procedures.

Fields: - COD_MENU: Menu node code - COD_PERE: Parent node code (for tree structure) - RANG: Position/rank within siblings - LIBELLE: Node label

Purpose: Navigable tree structure for browsing procedures by medical specialty/body system.

Example Structure:

Root
├─ Cardiovascular Surgery
│  ├─ Coronary Procedures
│  │  ├─ CABG
│  │  └─ Angioplasty
│  └─ Valve Surgery
└─ Neurosurgery
   └─ ...


9. RMO & QUALITY RULES

R_RMO (1 record)

Références Médicales Opposables (Medical Practice Guidelines).

Fields: - COD_INTERN: Internal code - REF_RMO: RMO reference - TITRE: Title - TEXTE + TEXTE0 through TEXTEE: Guideline text (~4,000 chars)

Purpose: Evidence-based medical practice guidelines.


R_ACTIVITE_RMO (0 records - currently unused)

Links activities to RMO guidelines.

Fields: - AA_COD + AADT_MODIF: Activity code - INTERN_COD → R_RMO: RMO reference


R_AGRE_RADIO (0 records - currently unused)

Radiology accreditation types.


R_ACTIVITE_AGRE_RADIO (0 records - currently unused)

Links activities to radiology accreditation requirements.


R_CLASSE_DMT (1 record)

DMT (Dispositifs Médicaux et Technologies) classification.


R_ACTE_CLASSE_DMT (0 records - currently unused)

Links procedures to DMT classes.


10. TECHNICAL TABLES (TB01-TB23)

These define coefficient grids, context rules, and association rules with temporal validity.

Common Pattern

All TB tables typically include: - DT_DEBUT, DT_FIN: Temporal validity period - GRILLE_COD: Pricing grid identifier - COEF or FORFAIT: Pricing impact


R_TB02 (100 records)

Association pricing coefficients.

Fields: - COD_ASSONP: Association code (2 chars) - LIBELLE: Description - COEF: Coefficient multiplier - GRILLE_COD: Pricing grid - DT_DEBUT, DT_FIN: Validity period


R_TB03 (20 records)

Association rule definitions (used by R_ASSOCIATIONS).

Fields: - COD_REGLE: Rule code (1 char) - LIBELLE + LIBELLE0: Rule description (~500 chars) - COEF: Coefficient to apply - GRILLE_COD: Pricing grid - DT_DEBUT, DT_FIN: Validity period

Purpose: Defines how to calculate pricing when procedures are associated (e.g., "second procedure at 50%").


R_TB11 (554 records)

Modifier codes with pricing impacts (documented above in section 4).


R_TB22 (390 records)

Context combination rules.

Fields: - COD_CONTXT: First context code - COD_CONTX0: Second context code - GRILLE_COD: Pricing grid - DT_DEBUT, DT_FIN: Validity period

Purpose: Defines valid combinations of beneficiary and provider contexts.


R_CONTEXT_BN (4 records)

Beneficiary context definitions.

Fields: - COD_CONTXT: Context code - LIBELLE: Description


R_CONTEXT_PS (54 records)

Healthcare provider context definitions.

Fields: - COD_CONTXT: Context code - LIBELLE: Description


Other TB Tables

  • R_TB01 (1 record): Purpose unclear
  • R_TB04 through R_TB23: Various specialized technical tables with similar structure

11. REFERENCE/LOOKUP TABLES

R_ACTIVITE (5 records)

Activity type definitions.

Values: - '1' = "1° activité chir/med" (primary surgical/medical activity) - '4' = "anesthésie" (anesthesia) - (5 types total)


R_PHASE (4 records)

Phase type definitions.


R_FORFAIT (5 records)

Package type definitions.


R_EXO_TM (6 records)

Tax exemption type definitions.


R_NAT_ASS (8 records)

Insurance nature type definitions.


R_EXTENSION (3 records)

Extension type definitions.


R_REGROUPEMENT (44 records)

Grouping definitions (e.g., 'ADC', 'ADA').


R_CATE_SPEC (5 records)

Specialty category definitions.


R_CATEGORIE_MEDIC (8 records)

Medical category definitions.


R_FRAIS_DEP (4 records)

Travel expense type definitions.


R_PAIEMENT (6 records)

Payment mode definitions.


R_REMBOURSEMENT (3 records)

Reimbursement mode definitions.


R_TYPE (3 records)

Procedure type definitions.


R_UNITE_OEUVRE (1 record)

Work unit definition with value.

Fields: - COD_UOEUVR: Work unit code - DT_EFFET: Effective date - VALEUR: Monetary value


COMPLETE DATA MODEL DIAGRAM

┌─────────────────────────────────────────────────────────┐
│                      R_MENU (tree)                      │
│                  (Classification Hierarchy)              │
│                     1,725 nodes                         │
└────────────────────────┬────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│                   ACTE (Procedure)                      │
│                    83,025 records                       │
│  • Identity & Names                                     │
│  • Type, Reimbursement, Travel                         │
│  • Versioning (Precedent/Suivant)                      │
│  • Constraints (Sex, Prior Agreement)                  │
├─────────────────────────────────────────────────────────┤
│  LINKED TO:                                             │
│  • Notes (R_NOTE_ACTE) - 40,930 records               │
│  • Prescribers (R_ACTE_PRESCRIPTEUR) - 91,347 rec     │
│  • Insurance (R_ACTE_NAT_ASS) - 33,915 rec            │
│  • Exemptions (R_ACTE_EXO_TM) - 84,975 rec            │
│  • Packages (R_ACTE_FORFAIT) - 1,438 rec              │
│  • Conditions (R_ACTE_COND_GEN) - 8,533 rec           │
│  • CMUC (R_ACTE_CMUC) - 910 rec                       │
│  • Procedures (R_PROCEDURE) - 11,539 rec              │
│  • Incompatibilities (R_INCOMPATIBILITES) - 107,437    │
└────────────────────────┬────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│            ACTIVITE (Activity Context)                  │
│              From: R_ACTE_IVITE                         │
│                 137,623 records                         │
│  • Activity Type (5 types)                             │
│  • Regroupement (44 groups)                            │
│  • Medical Category (8 categories)                     │
├─────────────────────────────────────────────────────────┤
│  LINKED TO:                                             │
│  • Executors (R_ACTIVITE_EXECUTANT) - 144,275 rec     │
│  • Modifiers (R_ACTIVITE_MODIFICATEUR) - 471,273 rec  │
│    └─> R_TB11 (554 modifier definitions)              │
│  • Extensions (R_ACTIVITE_EXTENSION) - 5 rec          │
│  • RMO Rules (R_ACTIVITE_RMO) - 0 rec (unused)        │
│  • Associations (R_ASSOCIATIONS) - 1,205,159 rec      │
│    └─> R_TB03 (20 association rules)                  │
└────────────────────────┬────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│         ACTIVITE_PHASE (Pricing Unit)                   │
│         From: R_ACTE_IVITE_PHASE                        │
│                137,884 records                          │
│  • Phase (4 phases)                                     │
│  • Payment Mode (6 modes)                               │
│  • Work Unit                                            │
│  • Pricing: Coefficient, Base Price, Supplement       │
│  • Constraints: Age, Sessions, Teeth                   │
│  • Scoring: SCORE, PRATIQUE, ICR                       │
├─────────────────────────────────────────────────────────┤
│  LINKED TO:                                             │
│  • Pricing Grids (R_PU_BASE) - 774,338 rec            │
│  • PMSI Integration (R_AAP_PMSI) - 13,749 rec         │
│  • Dental Positions (R_ACTIVITE_PHASE_DENT) - 16,322  │
│  • Medical Domains (R_ACTIVITE_PHASE_DOM) - 551,536   │
└─────────────────────────────────────────────────────────┘

RELATIONSHIP SUMMARY

Core Entities: 3 Levels

  1. ACTE (83,025) → 2. ACTIVITE (137,623) → 3. ACTIVITE_PHASE (137,884)

Business Rules: 1,324,135 relationships

  • Associations: 1,205,159
  • Incompatibilities: 107,437
  • Procedures: 11,539

Pricing: 788,087 records

  • PU_BASE: 774,338
  • AAP_PMSI: 13,749

Modifiers & Context: ~1,850,000 records

  • Modifiers: 471,273
  • Phase-Domain: 551,536
  • Executors: 144,275
  • Prescribers: 91,347
  • Exemptions: 84,975
  • Insurance: 33,915
  • Phase-Dental: 16,322
  • Conditions: 8,533
  • Forfaits: 1,438
  • CMUC: 910
  • Extensions: 5

Documentation: 51,634 records

  • Notes on Acts: 40,930
  • Glossary: 9,709
  • Notes on Menu: 995

Reference Tables: 23 small lookup tables

  • Types, Phases, Domains, Payment modes, Specialties, etc.

Technical Grids: 23 TB tables

  • Coefficient grids, context rules, temporal validity

KEY DESIGN PATTERNS

1. Temporal Versioning

All core tables include DT_MODIF (modification date) as part of the key, allowing tracking of changes over time without losing historical data.

2. Text Field Splitting

Long text fields are split across multiple 254-character fields (e.g., NOM_LONG, NOM_LONG0, NOM_LONG1, ...) due to DBF format limitations. Applications must concatenate these fields.

3. Composite Hierarchical Keys

Codes are built by concatenation: - AA_CODE (14 chars) = ACTE_COD (13) + ACTIV_COD (1) - AAP_COD (16 chars) = AA_CODE (14) + PHASE_COD (2)

4. Multi-Grid Pricing

The same activity-phase can have different prices depending on GRILLE_COD, allowing regional variations, different insurance schemes, etc.

5. Extensive Business Rules

The database includes massive association (1.2M) and incompatibility (107K) matrices that define: - Which procedures can be billed together - What pricing adjustments apply when combined - Which procedures are mutually exclusive

6. Empty/Unused Tables

Some tables are defined but currently empty: - R_ACTIVITE_RMO (0 records) - R_AGRE_RADIO (0 records) - R_ACTIVITE_AGRE_RADIO (0 records) - R_ACTE_CLASSE_DMT (0 records)

This suggests either future functionality or deprecated features.

7. PMSI Integration

Hospital coding system integration via R_AAP_PMSI provides resource consumption indices (ICR) for DRG-like hospital payment systems.


SUGGESTED IMPLEMENTATION

For Relational Database (SQL)

Schema: 1. Normalize around ACTE → ACTIVITE → ACTIVITE_PHASE hierarchy 2. Keep all reference tables as lookup enums 3. Create indexes on: - All code fields + modification dates - Foreign key relationships - Text search fields (NOM_COURT, NOM_LONG) 4. Create materialized views for: - Pricing calculations (joining PU_BASE, coefficients, majorations) - Full procedure descriptions (concatenating split text fields) - Current versions (filtering by DT_FIN IS NULL)

Challenges: - Text field concatenation in queries - Temporal queries (finding version valid at specific date) - Complex pricing calculations involving multiple tables


For Document/NoSQL Database

Structure: 1. ACTE documents containing: - Full text fields (concatenated) - Embedded ACTIVITE array - Each ACTIVITE contains embedded ACTIVITE_PHASE array - Embedded notes array - Embedded eligibility rules (prescribers, executors) 2. Separate collections for: - Associations (too large to embed) - Incompatibilities (too large to embed) - Pricing grids (can be joined at query time) 3. Denormalize frequently accessed lookups (activity types, phases, etc.)

Advantages: - Single document read for full procedure details - No text concatenation needed - Natural hierarchical structure

Challenges: - Large document size - Complex association/incompatibility queries - Update propagation for denormalized data


For Application Cache/Search Index

Elasticsearch/Solr approach: 1. Index ACTE documents with full-text search on: - Concatenated names - Notes - Glossary terms 2. Facets/filters on: - Menu hierarchy - Activity types - Specialty restrictions - Date ranges (current vs. historical) 3. Store pricing and business rules in relational DB 4. Hybrid architecture: search in index, transactional operations in SQL


DATA QUALITY NOTES

  1. Encoding: Files use cp850
  2. Record Counts: Some junction tables are very large (associations: 1.2M records)
  3. Hierarchical Integrity: Menu tree structure requires validation
  4. Temporal Consistency: Multiple date fields must be logically consistent
  5. Text Truncation: Long descriptions may exceed combined field limits
  6. Empty Tables: Several tables defined but unused (may indicate incomplete export)

BUSINESS LOGIC SUMMARY

This database represents a complete medical billing and coding system that enforces:

  1. Medical Rules: Which procedures can be performed by which specialists
  2. Financial Rules: Complex pricing with coefficients, majorations, and grid-based variations
  3. Insurance Rules: Coverage, exemptions, and reimbursement modes
  4. Combination Rules: Which procedures can/cannot be billed together and how pricing is adjusted
  5. Temporal Rules: Historical versioning of all procedures and pricing
  6. Documentation: Rich clinical and billing annotations
  7. Hospital Integration: PMSI resource indices for DRG-based systems

The system is production-grade, handling the complete medical coding needs of the French healthcare system.


VERSION INFORMATION

Source: CCAM database export as DBF files Location: source_dbf_data/ directory Format: dBASE III/IV format (.dbf) Total Files: 72 tables Total Records: ~4.8 million records across all tables Last Analysis: 2025-01-19