-- 1. Ajouter les extensions create extension if not exists vector; create extension if not exists isn; -- 2. Créer la table des produits create table produit ( id bigint primary key, ean13 EAN13 null, nom text not null, marque text null, categorie text null, energie int not null, proteines float4 null, glucides float4 null, sucres float4 null, graisses float4 null, graisses_saturees float4 null, sel float4 null, fibres float4 null, nutriscore int null, additifs int null, additifs_list text[] null, potassium float null, calcium float null, magnesium float null, sodium float null, chlorure float null, sulfate float null, nitrate float null, hydrogenocarbonate float null, silice float null, fluor float null, residu float null, ph float null, vitamin_a float null, vitamin_c float null ); -- 3. ajouter les commentaires comment on column produit.potassium IS 'K⁺ en mg/L'; comment on column produit.calcium IS 'Ca²⁺ en mg/L'; comment on column produit.magnesium IS 'Mg²⁺ en mg/L'; comment on column produit.sodium IS 'Na⁺ en mg/L'; comment on column produit.chlorure IS 'Cl⁻ en mg/L'; comment on column produit.sulfate IS 'SO₄²⁻ en mg/L'; comment on column produit.nitrate IS 'NO₃⁻ en mg/L'; comment on column produit.hydrogenocarbonate IS 'HCO₃⁻ en mg/L'; comment on column produit.silice IS 'SiO₂ en mg/L'; comment on column produit.fluor IS 'F en mg/L'; -- 4. importer les produits \COPY produit FROM '/tmp/produits/cereales_petitdejeuner.csv' (FORMAT CSV, header, ENCODING 'UTF8'); \COPY produit FROM '/tmp/produits/confiture.csv' (FORMAT CSV, header, ENCODING 'UTF8'); \COPY produit FROM '/tmp/produit.csv' (FORMAT CSV, header, ENCODING 'UTF8'); -- 5. ajouter une colonne vecteur alter table produit add column nutrition vector(10); -- 6. Création de l’index ivfflat create index produit_nutrition_hnsw on produit using hnsw (nutrition vector_l2_ops) with (m = 16, ef_construction = 200); -- 7. calculer la moyenne et l'écart-type pour chaque colonne, puis construire le vecteur : WITH stats AS ( SELECT AVG(energie) AS mu_energie, STDDEV_SAMP(energie) AS sigma_energie, AVG(proteines) AS mu_proteines, STDDEV_SAMP(proteines) AS sigma_proteines, AVG(glucides) AS mu_glucides, STDDEV_SAMP(glucides) AS sigma_glucides, AVG(sucres) AS mu_sucres, STDDEV_SAMP(sucres) AS sigma_sucres, AVG(graisses) AS mu_graisses, STDDEV_SAMP(graisses) AS sigma_graisses, AVG(graisses_saturees) AS mu_graisses_saturees, STDDEV_SAMP(graisses_saturees) AS sigma_graisses_saturees, AVG(sel) AS mu_sel, STDDEV_SAMP(sel) AS sigma_sel, AVG(fibres) AS mu_fibres, STDDEV_SAMP(fibres) AS sigma_fibres, AVG(nutriscore) AS mu_nutriscore, STDDEV_SAMP(nutriscore) AS sigma_nutriscore, AVG(additifs) AS mu_additifs, STDDEV_SAMP(additifs) AS sigma_additifs FROM produit ) UPDATE produit SET nutrition = ( SELECT ARRAY[ ((COALESCE(energie, mu_energie) - mu_energie) / NULLIF(sigma_energie,0)), ((COALESCE(proteines, mu_proteines) - mu_proteines) / NULLIF(sigma_proteines,0)), ((COALESCE(glucides, mu_glucides) - mu_glucides) / NULLIF(sigma_glucides,0)), ((COALESCE(sucres, mu_sucres) - mu_sucres) / NULLIF(sigma_sucres,0)), ((COALESCE(graisses, mu_graisses) - mu_graisses) / NULLIF(sigma_graisses,0)), ((COALESCE(graisses_saturees, mu_graisses_saturees) - mu_graisses_saturees) / NULLIF(sigma_graisses_saturees,0)), ((COALESCE(sel, mu_sel) - mu_sel) / NULLIF(sigma_sel,0)), ((COALESCE(fibres, mu_fibres) - mu_fibres) / NULLIF(sigma_fibres,0)), ((COALESCE(nutriscore, mu_nutriscore) - mu_nutriscore) / NULLIF(sigma_nutriscore,0)), ((COALESCE(additifs, mu_additifs) - mu_additifs) / NULLIF(sigma_additifs,0)) ]::vector FROM stats );