🗄️ Générateur de Schéma SQL

Structure réelle de la base de données - Généré le : 2025-09-15 23:52:19

📊 Tables (7)
7
Tables
53
Colonnes
17
Index
1
Clés étrangères
📋 appointment_logs 6 colonnes
  • id bigint PK
  • booking_id char(26) INDEX
  • level enum('INFO','WARN','ERROR')
  • message text
  • context json
  • created_at datetime
📋 appointments 13 colonnes
  • id bigint PK
  • booking_id char(26) UNIQUE
  • calendar_event_id varchar(255) INDEX
  • service_id varchar(32)
  • customer_id bigint INDEX FK
  • start_datetime datetime INDEX
  • end_datetime datetime
  • status enum('PENDING','CONFIRMED','CANCELED','FAILED')
  • calendar_sync_status enum('PENDING','SYNCED','FAILED')
  • cancellation_token varchar(512)
  • created_at datetime
  • updated_at datetime
  • ical_uid varchar(255) UNIQUE
Relations :
  • customer_id → customers.id
📋 availability_cache 7 colonnes
  • id bigint PK
  • service_id varchar(32) INDEX
  • slot_start datetime
  • slot_end datetime
  • source varchar(32)
  • version int
  • updated_at datetime
📋 customers 6 colonnes
  • id bigint PK
  • email varchar(255) UNIQUE
  • phone varchar(50)
  • first_name varchar(100)
  • last_name varchar(100)
  • created_at datetime
📋 resources 10 colonnes
  • id bigint unsigned PK
  • display_name varchar(150)
  • email varchar(255) INDEX
  • provider enum('ms365','google') INDEX
  • calendar_id varchar(256)
  • timezone varchar(50)
  • business_hours json
  • active tinyint(1)
  • created_at timestamp
  • updated_at timestamp
📋 sync_state 6 colonnes
  • id int PK
  • provider varchar(16)
  • resource varchar(128)
  • sync_cursor varchar(256)
  • subscription_id varchar(256)
  • expires_at datetime
📋 webhook_events 5 colonnes
  • id bigint PK
  • provider varchar(16)
  • event_type varchar(64)
  • payload json
  • received_at datetime
💾 Code SQL
CREATE TABLE `appointment_logs` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `booking_id` char(26) NOT NULL,
  `level` ENUM('INFO','WARN','ERROR') NOT NULL,
  `message` TEXT NOT NULL,
  `context` json DEFAULT NULL,
  `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_logs_booking` (`booking_id`)
) ENGINE=InnoDB AUTO_INCREMENT=384 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

CREATE TABLE `appointments` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `booking_id` char(26) NOT NULL,
  `calendar_event_id` VARCHAR(255) DEFAULT NULL,
  `service_id` VARCHAR(32) NOT NULL,
  `customer_id` bigint NOT NULL,
  `start_datetime` DATETIME NOT NULL,
  `end_datetime` DATETIME NOT NULL,
  `status` ENUM('PENDING','CONFIRMED','CANCELED','FAILED') NOT NULL DEFAULT 'PENDING',
  `calendar_sync_status` ENUM('PENDING','SYNCED','FAILED') DEFAULT 'PENDING',
  `cancellation_token` VARCHAR(512) DEFAULT NULL,
  `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` DATETIME DEFAULT NULL,
  `ical_uid` VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_appt_booking` (`booking_id`),
  UNIQUE KEY `uq_ical_uid` (`ical_uid`),
  KEY `fk_appt_customer` (`customer_id`),
  KEY `idx_appt_time` (`start_datetime`,`end_datetime`),
  KEY `idx_appt_calendar` (`calendar_event_id`),
  CONSTRAINT `fk_appt_customer` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

CREATE TABLE `availability_cache` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `service_id` VARCHAR(32) NOT NULL,
  `slot_start` DATETIME NOT NULL,
  `slot_end` DATETIME NOT NULL,
  `source` VARCHAR(32) NOT NULL DEFAULT 'M365',
  `version` INT NOT NULL DEFAULT '1',
  `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_avail` (`service_id`,`slot_start`,`slot_end`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

CREATE TABLE `customers` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(255) NOT NULL,
  `phone` VARCHAR(50) DEFAULT NULL,
  `first_name` VARCHAR(100) DEFAULT NULL,
  `last_name` VARCHAR(100) DEFAULT NULL,
  `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_customers_email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=324 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

CREATE TABLE `resources` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `display_name` VARCHAR(150) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` VARCHAR(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `provider` ENUM('ms365','google') COLLATE utf8mb4_unicode_ci NOT NULL,
  `calendar_id` VARCHAR(256) COLLATE utf8mb4_unicode_ci NOT NULL,
  `timezone` VARCHAR(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'Europe/Brussels',
  `business_hours` json DEFAULT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '1',
  `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_provider_calendar` (`provider`,`calendar_id`),
  KEY `idx_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `sync_state` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `provider` VARCHAR(16) NOT NULL,
  `resource` VARCHAR(128) NOT NULL,
  `sync_cursor` VARCHAR(256) DEFAULT NULL,
  `subscription_id` VARCHAR(256) DEFAULT NULL,
  `expires_at` DATETIME DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

CREATE TABLE `webhook_events` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `provider` VARCHAR(16) NOT NULL,
  `event_type` VARCHAR(64) NOT NULL,
  `payload` json NOT NULL,
  `received_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;