# Database Schema v1.0 Doel: PostGIS-first schema dat projecten, gebieden, datasets, analyses, AI-resultaten, QA/QC en exports ondersteunt. ## 1. projects ```sql id UUID PRIMARY KEY name TEXT NOT NULL description TEXT region TEXT DEFAULT 'Kempen' created_at TIMESTAMP NOT NULL updated_at TIMESTAMP NOT NULL ``` ## 2. areas ```sql id UUID PRIMARY KEY project_id UUID REFERENCES projects(id) name TEXT NOT NULL geometry GEOMETRY(POLYGON, 4326) NOT NULL area_m2 DOUBLE PRECISION crs TEXT DEFAULT 'EPSG:4326' created_at TIMESTAMP NOT NULL ``` ## 3. datasets ```sql id UUID PRIMARY KEY project_id UUID REFERENCES projects(id) name TEXT NOT NULL dataset_type TEXT NOT NULL -- raster, vector, lidar, reference, model_output source TEXT -- upload, GRB, OSM, Sentinel, DHMV original_path TEXT processed_path TEXT crs TEXT srid INTEGER bounds GEOMETRY(POLYGON, 4326) metadata_json JSONB status TEXT NOT NULL created_at TIMESTAMP NOT NULL updated_at TIMESTAMP NOT NULL ``` ## 4. dataset_versions ```sql id UUID PRIMARY KEY dataset_id UUID REFERENCES datasets(id) version_label TEXT path TEXT metadata_json JSONB created_at TIMESTAMP NOT NULL ``` ## 5. vector_features ```sql id UUID PRIMARY KEY dataset_id UUID REFERENCES datasets(id) source_feature_id TEXT feature_type TEXT properties JSONB geometry GEOMETRY(GEOMETRY, 4326) created_at TIMESTAMP NOT NULL ``` Spatial index required on geometry. ## 6. raster_assets ```sql id UUID PRIMARY KEY dataset_id UUID REFERENCES datasets(id) asset_type TEXT -- original, clipped, tile, preview, index, mask path TEXT NOT NULL bounds GEOMETRY(POLYGON, 4326) metadata_json JSONB created_at TIMESTAMP NOT NULL ``` ## 7. analysis_runs ```sql id UUID PRIMARY KEY project_id UUID REFERENCES projects(id) area_id UUID REFERENCES areas(id) analysis_type TEXT NOT NULL -- detection, segmentation, qaqc, change, raster_index status TEXT NOT NULL parameters_json JSONB started_at TIMESTAMP finished_at TIMESTAMP error_message TEXT created_at TIMESTAMP NOT NULL ``` ## 8. detections ```sql id UUID PRIMARY KEY analysis_run_id UUID REFERENCES analysis_runs(id) class_name TEXT NOT NULL confidence DOUBLE PRECISION bbox_json JSONB source_tile_path TEXT geometry GEOMETRY(POLYGON, 4326) metadata_json JSONB created_at TIMESTAMP NOT NULL ``` Spatial index required on geometry. ## 9. segmentations ```sql id UUID PRIMARY KEY analysis_run_id UUID REFERENCES analysis_runs(id) class_name TEXT NOT NULL confidence DOUBLE PRECISION area_m2 DOUBLE PRECISION raster_mask_path TEXT geometry GEOMETRY(GEOMETRY, 4326) metadata_json JSONB created_at TIMESTAMP NOT NULL ``` ## 10. metrics ```sql id UUID PRIMARY KEY analysis_run_id UUID REFERENCES analysis_runs(id) metric_key TEXT NOT NULL metric_value DOUBLE PRECISION unit TEXT metadata_json JSONB created_at TIMESTAMP NOT NULL ``` ## 11. quality_checks ```sql id UUID PRIMARY KEY analysis_run_id UUID REFERENCES analysis_runs(id) reference_dataset_id UUID REFERENCES datasets(id) check_type TEXT NOT NULL score DOUBLE PRECISION findings_json JSONB created_at TIMESTAMP NOT NULL ``` ## 12. quality_findings ```sql id UUID PRIMARY KEY quality_check_id UUID REFERENCES quality_checks(id) finding_type TEXT NOT NULL -- false_positive, false_negative, low_iou, matched class_name TEXT score DOUBLE PRECISION geometry GEOMETRY(GEOMETRY, 4326) metadata_json JSONB created_at TIMESTAMP NOT NULL ``` ## 13. annotations ```sql id UUID PRIMARY KEY project_id UUID REFERENCES projects(id) dataset_id UUID REFERENCES datasets(id) class_name TEXT NOT NULL annotation_type TEXT -- bbox, polygon, mask geometry GEOMETRY(GEOMETRY, 4326) metadata_json JSONB created_at TIMESTAMP NOT NULL ``` ## 14. model_registry ```sql id UUID PRIMARY KEY name TEXT NOT NULL model_type TEXT -- yolo, sam, unet, custom_pytorch version TEXT artifact_path TEXT classes_json JSONB metrics_json JSONB created_at TIMESTAMP NOT NULL ``` ## 15. exports ```sql id UUID PRIMARY KEY project_id UUID REFERENCES projects(id) analysis_run_id UUID REFERENCES analysis_runs(id) export_type TEXT NOT NULL -- geojson, yolo, coco, mask, report path TEXT NOT NULL metadata_json JSONB created_at TIMESTAMP NOT NULL ``` ## 16. jobs ```sql id UUID PRIMARY KEY job_type TEXT NOT NULL status TEXT NOT NULL payload_json JSONB result_json JSONB error_message TEXT created_at TIMESTAMP NOT NULL started_at TIMESTAMP finished_at TIMESTAMP ``` ## Indexen - areas.geometry GIST - datasets.bounds GIST - vector_features.geometry GIST - detections.geometry GIST - segmentations.geometry GIST - quality_findings.geometry GIST - annotations.geometry GIST ## Belangrijke regels - Grote bestanden nooit in database opslaan. - Geometrieën altijd met SRID opslaan. - Iedere modeloutput moet gekoppeld zijn aan een analysis_run. - Iedere analysis_run moet parameters opslaan voor reproduceerbaarheid.