Re: Re: [pgsql-fr-generale] Meilleur moyen de créer des tuples ?

From: Denis Bitouzé <dbitouze(at)wanadoo(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Re: [pgsql-fr-generale] Meilleur moyen de créer des tuples ?
Date: 2007-12-31 17:46:00
Message-ID: 20071231184600.5e97513b@drums
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Le Mon, 31 Dec 2007 08:24:05 +0100
Sébastien Lardière <sebastien(at)lardiere(dot)net> a écrit :

> Bonjour,

Bonjour,

> Il me parait plus simple de créer des groupes, et de mettre les
> utilisateurs dans des groupes, non ?
>
> group_id | user_id
> ----------------|--------------
> 1 | 1
> 1 | 2
> 1 | 3
> 2 | 4
> 3 | 5

Oui, c'est aussi ce qui a fini par me traverser l'esprit ;) J'ai un mal
fou à penser en terme de tables.

> Avec une clé primaire sur les deux champs,

Oui, ça, c'est ce que j'avais fait. Et puis, à la réflexion, je me suis
dit que ce n'était pas très pratique, dans le cadre d'une interface (Web
par exemple) où l'on n'aurait qu'à choisir les sous-ensembles
d'utilisateurs, de générer ce genre de table avec une telle clé
primaire.

Donc, finalement, j'ai persisté avec une table du genre (en fait, au
lieu de tuples, je parle plutôt de polynômes -- généralisation de
binôme, trinôme, etc. --, mes « utilisateurs » sont des étudiants et il
y a, en colonne supplémentaire, l'épreuve qu'ils subissent ;) :

select * from polynomes;
id_epreuve | id_etudiants_polynomes | id_poly
------------+------------------------+---------
1 | {5,15} | 1
1 | {6,23} | 2
1 | {10,11} | 3
1 | {13,21} | 4
1 | {26,24} | 5
1 | {17,18} | 6
1 | {52,53,54} | 7

où id_poly est la clé primaire, de type serial pour ne pas avoir à me
préoccuper de sa génération.

J'ai créé une fonction pour récupérer le tableau des étudiants du même
polynôme qu'un étudiant donné :

CREATE FUNCTION tableau_polynome(epreuve integer, etudiant integer)
RETURNS integer[] AS $$
DECLARE
polynome polynomes.id_etudiants_polynomes%TYPE;
BEGIN
SELECT INTO polynome id_etudiants_polynomes from polynomes where
etudiant=any(id_etudiants_polynomes) and id_epreuve=epreuve;
RETURN polynome;
END;
$$
LANGUAGE plpgsql;

puis une fonction me permettant d'accéder à un élément donné d'un des
tableaux précédents :

CREATE FUNCTION polynome(epreuve integer, etudiant integer, num
integer) RETURNS integer AS $$
DECLARE
tab_polynome polynomes.id_etudiants_polynomes%TYPE;
BEGIN
SELECT INTO tab_polynome * from tableau_polynome(epreuve,etudiant);
RETURN tab_polynome[num];
END;
$$
LANGUAGE plpgsql;

et enfin une fonction me permettant de lister sous forme de lignes les
éléments du tableau correspondant à un étudiant donné :

CREATE FUNCTION polynomes(epreuve integer, etudiant integer) RETURNS
SETOF integer AS $$
DECLARE
maxi int4;
id_etudiant_polynome int4;
BEGIN
SELECT INTO maxi array_upper(id_etudiants_polynomes,1) from polynomes
where etudiant=any(id_etudiants_polynomes) and id_epreuve=1; IF maxi
IS NULL THEN
RETURN NEXT etudiant;
ELSE
FOR i IN 1..maxi LOOP
SELECT INTO id_etudiant_polynome * FROM polynome(epreuve,etudiant,i);
RETURN NEXT id_etudiant_polynome;
END LOOP;
END IF;
END;
$$
LANGUAGE plpgsql;

Je n'ai pas beaucoup de recul sur PostgreSQL donc je n'ai aucune
idée de la pertinence de ce que je fais...

> et éventuellement un
> aggrégat pour rassembler les utilisateurs ...

Peux-tu me donner un exemple de la chose ? J'ai un peu de mal à
comprendre le concept d'agrégat (par exemple, j'ai été très surpris de
voir qu'on disposait de sum, avg, etc. mais pas de min ou de max !).

En tous cas, merci !
--
Denis

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Sébastien Lardière 2008-01-02 08:09:54 Re: [pgsql-fr-generale] Re: [pgsql-fr-generale] Meilleur moyen de créer des tuples ?
Previous Message Sébastien Lardière 2007-12-31 07:24:05 Re: [pgsql-fr-generale] Meilleur moyen de créer des tuples ?