Structure de Base de Données : Datasets Normalisés
Vue d’ensemble
La structure de base de données d’EXAI a été entièrement refondée pour supporter une approche normalisée de la gestion des datasets. Cette nouvelle architecture remplace l’ancienne table unique datasets
par 5 tables relationnelles interconnectées qui offrent une granularité et une flexibilité bien supérieures.
Objectifs de la Refonte
-
Normalisation : Élimination de la redondance et amélioration de l’intégrité des données
-
Granularité : Gestion détaillée des fichiers et colonnes individuels
-
Métadonnées éthiques : Support étendu pour les critères éthiques de l’IA explicable
-
Multi-fichiers : Support natif des datasets composés de plusieurs fichiers
-
Relations : Traçabilité des relations entre fichiers et colonnes
-
Évolutivité : Structure adaptée aux besoins futurs d’EXAI
Structure des Tables
La nouvelle structure comprend 5 tables principales organisées hiérarchiquement :
@startuml !theme plain entity "datasets" as dataset { + id : UUID [PK] -- dataset_name : VARCHAR(255) year : INTEGER objective : TEXT access : VARCHAR(100) availability : VARCHAR(100) num_citations : INTEGER citation_link : TEXT sources : TEXT storage_uri : VARCHAR(500) ... (40+ champs métadonnées) -- created_at : TIMESTAMPTZ updated_at : TIMESTAMPTZ } entity "dataset_files" as file { + id : UUID [PK] -- dataset_id : UUID [FK] file_name_in_storage : VARCHAR(255) logical_role : VARCHAR(255) format : VARCHAR(50) mime_type : VARCHAR(100) size_bytes : BIGINT row_count : BIGINT description : TEXT -- created_at : TIMESTAMPTZ updated_at : TIMESTAMPTZ } entity "file_columns" as column { + id : UUID [PK] -- dataset_file_id : UUID [FK] column_name : VARCHAR(255) data_type_original : VARCHAR(100) data_type_interpreted : VARCHAR(50) description : TEXT is_primary_key_component : BOOLEAN is_nullable : BOOLEAN is_pii : BOOLEAN example_values : TEXT[] position : INTEGER stats : JSONB -- created_at : TIMESTAMPTZ updated_at : TIMESTAMPTZ } entity "dataset_relationships" as relationship { + id : UUID [PK] -- dataset_id : UUID [FK] from_file_id : UUID [FK] to_file_id : UUID [FK] relationship_type : VARCHAR(50) description : TEXT -- created_at : TIMESTAMPTZ updated_at : TIMESTAMPTZ } entity "dataset_relationship_column_links" as link { + id : UUID [PK] -- relationship_id : UUID [FK] from_column_id : UUID [FK] to_column_id : UUID [FK] link_order : INTEGER } dataset ||--o{ file file ||--o{ column dataset ||--o{ relationship file ||--o{ relationship relationship ||--o{ link column ||--o{ link @enduml
Table datasets
(Principale)
La table principale contient toutes les métadonnées d’un dataset, organisées en sections logiques :
Identification & Informations Générales
-
dataset_name
: Nom du dataset -
year
: Année de création/publication -
objective
: Description de l’objectif du dataset -
access
: Niveau d’accès (public, privé, etc.) -
availability
: Disponibilité du dataset -
num_citations
: Nombre de citations -
citation_link
: Lien vers les informations de citation -
sources
: Sources et origines du dataset -
storage_uri
: URI de stockage du dataset
Caractéristiques Techniques
-
instances_number
: Nombre d’instances/lignes -
features_description
: Description des caractéristiques -
features_number
: Nombre de caractéristiques/colonnes -
domain
: Domaines d’application (array) -
representativity_description
: Description de la représentativité -
representativity_level
: Niveau de représentativité -
sample_balance_description
: Description de l’équilibre des échantillons -
sample_balance_level
: Niveau d’équilibre des échantillons -
split
: Dataset déjà divisé en train/test -
missing_values_description
: Description des valeurs manquantes -
has_missing_values
: Présence de valeurs manquantes -
global_missing_percentage
: Pourcentage global de valeurs manquantes -
missing_values_handling_method
: Méthode de traitement des valeurs manquantes -
temporal_factors
: Présence de facteurs temporels -
metadata_provided_with_dataset
: Métadonnées fournies avec le dataset -
external_documentation_available
: Documentation externe disponible -
documentation_link
: Lien vers la documentation -
task
: Types de tâches ML supportées (array)
Critères Éthiques (Spécifiques à EXAI)
-
informed_consent
: Consentement éclairé obtenu -
transparency
: Transparence des données -
user_control
: Contrôle utilisateur -
equity_non_discrimination
: Équité et non-discrimination -
security_measures_in_place
: Mesures de sécurité en place -
data_quality_documented
: Qualité des données documentée -
data_errors_description
: Description des erreurs de données -
anonymization_applied
: Anonymisation appliquée -
record_keeping_policy_exists
: Politique de conservation des données -
purpose_limitation_respected
: Limitation d’usage respectée -
accountability_defined
: Responsabilités définies
Table dataset_files
Gère les fichiers individuels associés à un dataset.
-- Exemple : Dataset avec fichiers multiples
INSERT INTO dataset_files (dataset_id, file_name_in_storage, logical_role) VALUES
('uuid-dataset', 'train.csv', 'training_data'),
('uuid-dataset', 'test.csv', 'test_data'),
('uuid-dataset', 'metadata.json', 'metadata');
Table file_columns
Décrit chaque colonne/feature d’un fichier avec ses métadonnées détaillées.
-- Exemple : Colonnes d'un fichier CSV
INSERT INTO file_columns (dataset_file_id, column_name, data_type_interpreted, is_pii, position) VALUES
('uuid-file', 'user_id', 'identifier', true, 1),
('uuid-file', 'age', 'numerical', false, 2),
('uuid-file', 'income', 'numerical', false, 3);
Champs spécialisés
-
data_type_original
: Type original dans le fichier -
data_type_interpreted
: Type interprété (numerical
,categorical
,text
,identifier
, etc.) -
is_primary_key_component
: Fait partie de la clé primaire -
is_pii
: Contient des informations personnelles (important pour l’éthique) -
example_values
: Exemples de valeurs (array) -
stats
: Statistiques calculées (JSON) - min, max, mean, std, etc.
Table dataset_relationships
Décrit les relations logiques entre fichiers d’un même dataset ou de datasets différents.
-- Exemple : Relation foreign key entre deux fichiers
INSERT INTO dataset_relationships (dataset_id, from_file_id, to_file_id, relationship_type) VALUES
('uuid-dataset', 'uuid-users-file', 'uuid-orders-file', 'foreign_key');
Table dataset_relationship_column_links
Spécifie précisément quelles colonnes sont liées dans une relation.
-- Exemple : Lien user_id -> customer_id
INSERT INTO dataset_relationship_column_links (relationship_id, from_column_id, to_column_id, link_order) VALUES
('uuid-relationship', 'uuid-user-id-column', 'uuid-customer-id-column', 1);
Migration et Compatibilité
Migration Alembic
La migration 71ec68fa0302
effectue la transition complète :
# Application de la migration
cd service-selection
alembic upgrade head
La migration :
1. Supprime l’ancienne table datasets
2. Crée les 5 nouvelles tables avec toutes leurs contraintes
3. Ajoute tous les index nécessaires pour les performances
Cette migration est destructive et supprime toutes les données existantes. Assurez-vous d’avoir une sauvegarde si nécessaire. |
Modèles Pydantic
La refonte inclut des schémas Pydantic complets pour chaque table :
Schémas de base
-
DatasetBase/Create/Update/Read
-
DatasetFileBase/Create/Update/Read
-
FileColumnBase/Create/Update/Read
-
DatasetRelationshipBase/Create/Update/Read
-
DatasetRelationshipColumnLinkBase/Create/Update/Read
Exemples d’Usage
Création d’un dataset complet
# 1. Créer le dataset principal
dataset = Dataset(
dataset_name="Customer Analytics Dataset",
year=2024,
objective="Analyse comportementale des clients",
domain=["marketing", "analytics"],
task=["classification", "clustering"],
anonymization_applied=True,
informed_consent=True
)
# 2. Ajouter des fichiers
train_file = DatasetFile(
dataset_id=dataset.id,
file_name_in_storage="customers_train.csv",
logical_role="training_data",
format="csv",
row_count=10000
)
test_file = DatasetFile(
dataset_id=dataset.id,
file_name_in_storage="customers_test.csv",
logical_role="test_data",
format="csv",
row_count=2500
)
# 3. Décrire les colonnes
columns = [
FileColumn(
dataset_file_id=train_file.id,
column_name="customer_id",
data_type_interpreted="identifier",
is_primary_key_component=True,
is_pii=True,
position=1
),
FileColumn(
dataset_file_id=train_file.id,
column_name="age_group",
data_type_interpreted="categorical",
example_values=["18-25", "26-35", "36-50", "50+"],
position=2
)
]
Requête de filtrage avancée
# Recherche avec critères éthiques
filters = DatasetFilterCriteria(
domain=["healthcare", "finance"],
anonymization_applied=True,
informed_consent=True,
instances_number_min=1000,
year_min=2020
)
# Scoring basé sur critères éthiques
weights = [
CriterionWeight(criterion_name="anonymization_applied", weight=2.0),
CriterionWeight(criterion_name="informed_consent", weight=2.0),
CriterionWeight(criterion_name="transparency", weight=1.5),
CriterionWeight(criterion_name="data_quality_documented", weight=1.0)
]
score_request = DatasetScoreRequest(filters=filters, weights=weights)
Performance et Index
Considérations de Sécurité
Évolution Future
Cette structure normalisée prépare le terrain pour :
-
Versioning des datasets : Ajout de tables de versions
-
Provenance des données : Traçabilité complète de l’origine
-
Métadonnées ML : Informations sur les modèles entraînés
-
Audit avancé : Logs détaillés des accès et modifications
-
Fédération : Support de datasets distribués
Cette architecture respecte les principes de normalisation de base de données tout en étant optimisée pour les besoins spécifiques d’EXAI en matière d’explicabilité et d’éthique de l’IA. |