On Fri, 5 Oct 2001, Francois Deppierraz wrote:

> Comment est-ce possible ? Car il me semble que les relations ne sont pas
> stock�es dans la base de donn�es, elles sont cr��es d'apr�s les requ�tes
> (JOIN and co), non ?

Oui, mais on structure en g�n�ral la base de donn�es en cons�quence, avec
des FOREIGN KEYS, contraintes d'int�grit�, etc.

Exemple:

CREATE TABLE utilisateur_news (id SERIAL NOT NULL,
                               login VARCHAR(8) NOT NULL,
                               UNIQUE(login),
                               UNIQUE(id),
                               PRIMARY KEY(id));
   -- Contraintes d'int�grit�:
   --    Un login ne peut exister qu'une seule fois.

CREATE TABLE forum (id SERIAL NOT NULL,
                    nom_forum VARCHAR(100) NOT NULL,
                    UNIQUE(nom_forum),
                    UNIQUE(id),
                    PRIMARY KEY(id));
   -- Contraintes d'int�grit�:
   --    Un nom_forum ne peut exister qu'une seule fois.

CREATE TABLE a_acces(utilisateur INT4 REFERENCES utilisateur_news NOT NULL,
                     forum INT4 REFERENCES forum NOT NULL,
                     UNIQUE(utilisateur, forum));
   -- Contraintes d'int�grit�:
   --    Un couple d'(utilisateur, forum) existe au plus � un
   --    exemplaire.

Dans ce cas le graphe attendu est quelque chose comme

   utilisateur_news     ------- a_acces ------- forum
      id*+                                      id
      login                                     nom_forum

Ce qui correspond � peu pr�s au diagramme entit�-relation qui serait:

   utilisateur_news  n ---- a_acces ---- n  forum

Le programme *pourrait* deviner la cardinalit� n-n car il n'y a pas
d'UNIQUE(utilisateur) ou UNIQUE(forum) dans a_access, et/ou
utilisateur_news ou forum ne r�f�rencent pas directement l'autre, mais via
une relation interm�diaire a_access (sinon 1:n ou n:1).

NB: on aurait pu aussi utiliser directement login et nom_forum comme
identifiants sans passer par des SERIAL. On remarque �galement un bug de
PostgreSQL qui consiste � d�finir SERIAL comme un INT4: un type `SERIAL_T'
serait plus appropri� pour pouvoir le r�p�ter lors du REFERENCES.

(et tout cela ne nous avance pas pour trouver un tel programme)

--
http://www-internal.alphanet.ch/linux-leman/ avant de poser
une question. Ouais, pour se d�sabonner aussi.

Répondre à