#1 Wed 10 February 2010 15:03
- nina07
- Juste Inscrit !
- Date d'inscription: 10 Feb 2010
- Messages: 4
Extension de Postgesql avec un nouveau type de données
Bonjour,
j'aimerais étendre postgresql avec un nouveau type de données qui pourrait être utilisé au sein d'une requête. D'après ce que j'ai cru comprendre, il existe deux alternatives :
1-soit modifier le code source
2- soit créer une bibliothèque partagée codant ce type + ses opérations. Cette bibliothèque sera chargée à la demande.
C'est bien ça?
J'ai essayé de coder une biblio partagée (sous windows), mais je n'arrive pas à la charger dynamiquement sous windows.
Auriez vous la gentillesse de m'expliquer les étapes et les outils (peut être qu'il va en faloir) nécessaires pour créer mon type sous cette forme.
Merci
Hors ligne
#2 Wed 10 February 2010 16:21
Re: Extension de Postgesql avec un nouveau type de données
Bonjour,
Il me semble que Pgsql propose de créer ses propres types de données : http://docs.postgresqlfr.org/8.3/sql-createtype.html
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#3 Wed 10 February 2010 18:04
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: Extension de Postgesql avec un nouveau type de données
Bonjour,
j'aimerais étendre postgresql avec un nouveau type de données qui pourrait être utilisé au sein d'une requête. D'après ce que j'ai cru comprendre, il existe deux alternatives :
1-soit modifier le code source
2- soit créer une bibliothèque partagée codant ce type + ses opérations. Cette bibliothèque sera chargée à la demande.
C'est bien ça?
J'ai essayé de coder une biblio partagée (sous windows), mais je n'arrive pas à la charger dynamiquement sous windows.
Auriez vous la gentillesse de m'expliquer les étapes et les outils (peut être qu'il va en faloir) nécessaires pour créer mon type sous cette forme.
Merci
Bonjour,
Il me semble qu'il est egalement possible de definir un nouveau type en SQL seulement, sans ecrire de bibliotheque, pour peu que le nouveau type se compose de types de base. Des fonctions plpgsql peuvent suffire pour manipuler ce type.
A voir si un tel type peut correspondre a vos besoins:
http://www.postgresql.org/docs/8.4/static/rowtypes.html
Nicolas
Hors ligne
#4 Thu 11 February 2010 10:29
- nina07
- Juste Inscrit !
- Date d'inscription: 10 Feb 2010
- Messages: 4
Re: Extension de Postgesql avec un nouveau type de données
Merci pour les réponses.
En fait, pour être plus claire, mon but est d'intégrer le nouveau type (un type absrait de donnée) + ses opérations de telle sorte qu'il puisse être utilisé par n'importe quel utilisateur du SGBD au même titre qu'un type "prédéfinis" (entier, point, etc...). Ainsi, un nouvel utilisateur pourra créer une nouvelle base, avec de nouvelles tables ayant comme type d'attribut (de colonne en fait) ce nouveau type.
J'ai même une description de son domaine de valeurs.
Je ne me suis pas encore bien concentrée sur le problème, mais je suppose qyue c'est le CREATE TYPE qu'il me faut. LA question est comment faire pour qu'il puisse être "reconnu" par n'importe quel utilisateur.
Merci encore.
Hors ligne
#5 Thu 11 February 2010 10:44
Re: Extension de Postgesql avec un nouveau type de données
Nota : ce message est envoyé en retard, il a été écrit avant la dernière réponse. Je poste tout de meme.
Bonjour,
j'aimerais étendre postgresql avec un nouveau type de données qui pourrait être utilisé au sein d'une requête. D'après ce que j'ai cru comprendre, il existe deux alternatives :
1-soit modifier le code source
2- soit créer une bibliothèque partagée codant ce type + ses opérations. Cette bibliothèque sera chargée à la demande.
Non, il ne faut certainement pas modifier le code source de PostgreSQL. Tu aurais de grandes chances de tout casser, et ton code serait inmaintenable avec les nouvelles versions.
La bonne voie si on en arrive à mettre les mains dans les couches bas niveau (ie le code C), est de créer des extensions. C'est ta solution 2, et il faut de la motivation, un bon niveau de C, du temps et des connaissances du fonctionnement interne de PostgreSQL pour se lancer la dedans. On en arrive la quand on a des contraintes ou des besoins forts, il y a d'autres solutions plus simples avant (cf ci dessous).
J'ai essayé de coder une biblio partagée (sous windows), mais je n'arrive pas à la charger dynamiquement sous windows.
Auriez vous la gentillesse de m'expliquer les étapes et les outils (peut être qu'il va en faloir) nécessaires pour créer mon type sous cette forme.
A noter qu'en environnement windows c'est encore plus compliqué : le passage par le compilateur MS est souvent scabreux (et tarifé), et l'utilisation de MinGW pour profiter de GCC nécessite la mise en place complexe d'un environnement de développement.
Il me semble qu'il est egalement possible de definir un nouveau type en SQL seulement, sans ecrire de bibliotheque, pour peu que le nouveau type se compose de types de base. Des fonctions plpgsql peuvent suffire pour manipuler ce type.
A voir si un tel type peut correspondre a vos besoins:
http://www.postgresql.org/docs/8.4/static/rowtypes.html
Effectivement c'est la piste la plus simple et la plus efficace (en terme de ratio effort / résultat, pas performances). PostgreSQL permet bien de définir ses propres types, et il en crée même un pour chaque table qui est créée dans la base.
Ensuite il est assez facile de coder des fonctions en PLPgSQL pour faire des actions sur ces types, incluant des requetes SQL et en utilisant les fonctions SQL et PLPgSQL déjà existantes dans PostgreSQL.
Voir :
http://docs.postgresql.fr/8.4/server-programming.html
Ça suffit dans de nombreux cas.
Maintenant, pour savoir quelle est la solution qui correspond le mieux, il faudrait avoir une description du besoin précis.
Quelques contraintes qui peuvent faire qu'on doive passer à de la programmation par extension :
* performance : on ne battra pas le C pour cela (mais on fera d'abord de l'optimisation algorithmique)
* Utilisation de bibliothèques externes
* Indexation poussée : certains types de données nécessitent une indexation particulière. Par exemple les données SIG qui sont des géométries en deux dimension.
* Types de données complexes : ceux qui ne peuvent pas etre représentés par une composition de types simples de PostgreSQL (ex : des images rasters).
* Exercice d'école (ça peut arriver
A moins que tu n'aies certaines ou toutes ces contraintes, je commencerais à ta place par jeter un oeil sur la programmation coté serveur avec du plpgsql.
Hors ligne
#6 Thu 11 February 2010 11:09
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: Extension de Postgesql avec un nouveau type de données
Merci pour les réponses.
En fait, pour être plus claire, mon but est d'intégrer le nouveau type (un type absrait de donnée) + ses opérations de telle sorte qu'il puisse être utilisé par n'importe quel utilisateur du SGBD au même titre qu'un type "prédéfinis" (entier, point, etc...). Ainsi, un nouvel utilisateur pourra créer une nouvelle base, avec de nouvelles tables ayant comme type d'attribut (de colonne en fait) ce nouveau type.
J'ai même une description de son domaine de valeurs.
Je ne me suis pas encore bien concentrée sur le problème, mais je suppose qyue c'est le CREATE TYPE qu'il me faut. LA question est comment faire pour qu'il puisse être "reconnu" par n'importe quel utilisateur.
Merci encore.
Le type, crée par un administrateur, sera disponible pour les autres utilisateurs (normaux).
Voici un petit test effectué:
Connecté en tant qu'admin Postgresql:
create type mytype as (nom text, prenom text);
create table toto (id int, nom_complet mytype);
insert into toto (id, nom_complet) values (1, '("nico", "ribo")');
postgis=# select id, (nom_complet).nom, (nom_complet).prenom from toto;
id | nom | prenom
----+------+--------
1 | nico | ribo
(1 ligne)
grant select on toto to test;
Puis connexion en tant que "test", qui est un utilisateur normal:
je peux faire :
select id, (nom_complet).nom, (nom_complet).prenom from toto;
Comme le dit Vincent, cet exemple est basique en ce sens qu'il ne cree en fait qu'une nouvelle "table", mytype, qui est une composition de types simples de postgresql.
Dans ce cas, des fonctions plpgsql peuvent egalement suffire pour manipuler ce type.
Si le type à créer est plus complexe et demande des traitements particuliers (comme le type "geometry" ajouté par Postgis), alors, des methodes d'acces en C ou Python sont necessaires.
Postgis doit etre une bonne source d'exemples pour voir comment ajouter un type complexe dans PG.
Nicolas
Hors ligne
#7 Thu 11 February 2010 14:19
- nina07
- Juste Inscrit !
- Date d'inscription: 10 Feb 2010
- Messages: 4
Re: Extension de Postgesql avec un nouveau type de données
Merci Nicolas, Yves et Vincent pour ces réponses constructives.
Effectivement, Nicolas, mon type nécessite des traitements assez complexe et il est en plus de "nature" spatiale. Je comptais consulter Postgis à une étape ultérieure mais je crois que le faire à ce stade est une bonne idée!
Merci encore.
Hors ligne
#8 Thu 11 February 2010 15:22
Re: Extension de Postgesql avec un nouveau type de données
Merci Nicolas, Yves et Vincent pour ces réponses constructives.
Effectivement, Nicolas, mon type nécessite des traitements assez complexe et il est en plus de "nature" spatiale. Je comptais consulter Postgis à une étape ultérieure mais je crois que le faire à ce stade est une bonne idée!
J'en rajoute une couche : la plupart du temps les demandes un peu vagues sur des types de données spécifiques cachent en fait une mauvaise modélisation du problème. Du genre : "je n'arrive pas bien à stocker des tableaux dans ma base". C'est souvent une mauvaise approche, car on perd quasiment systématiquement les avantages d'utiliser une base de données relationnelle : indexation, jointures, requêtage SQL… Repenser la modélisation permet en général de résoudre simplement ce qui paraissait impossible auparavant.
Dans le fond je pense que ta problématique est largement traitable par les fonctionnalités classiques de PostgreSQL, avec PostGIS pour le coté spatial, et du code plpgsql pour les traitements.
Je t'invite donc à nous donner le fond du problème (ce que tu veux stocker, et quelles actions tu veux effectuer dessus) pour que l'on en ait le coeur net
vincent
Dernière modification par vincentp (Thu 11 February 2010 17:15)
Hors ligne
#9 Thu 11 February 2010 16:18
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3193
- Site web
Re: Extension de Postgesql avec un nouveau type de données
Bonjour,
+1 avec vincentp, j'ajouterais en plus "pouvez vous nous préciser le contexte d'utilisation est-ce une attaque brute uniquement base de donnée où y a-t-il une interface programmée ?" Car là aussi il est possible d'avoir des objets complexes dans la couche métier représentés par des type "simples" dans la base de donnée.
A+
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#10 Fri 02 April 2010 16:39
- nina07
- Juste Inscrit !
- Date d'inscription: 10 Feb 2010
- Messages: 4
Re: Extension de Postgesql avec un nouveau type de données
Re-Bonjour,
En fait le type que je dois implémenter doit :
- Etendre le système de type de Postgresql/PostGIS
- Etre un Type abstrait de donnée, ceci implique que ses différentes composantes doivent être encapsulées et ne doivent être accessible qu'à travers les opérations du type
- est de nature spatio-temporelle (encapsule des éléments eux mêmes composés de données spatiales et temporelles)
Doit il pour cela être implémenté comme
- un type de base et donc en lgge C (pour pouvoir étendre le système de type et garantir aussi l'encapsulation)?
- Un type composite peut faire l'affaire?
Dans le cas d'une définition C (typdef), toutes les fonctions sur le type doivent aussi être implémentées en C ou est ce qu'elles peuvent être définis avec PLPgSQL?
Merci
Hors ligne