Journal Problèmes avec POSTGRESQL

Posté par  .
Étiquettes : aucune
0
25
jan.
2004
J'ai une table en postgresql:
test=# select * from transaction order by id;
id | amount | balance
----+--------+---------
1 | 10 | 10
2 | 1 | 11
3 | -4 | 7

BALANCE est la somme commulée de tous les 'AMOUNT' (un peu comme les extraits de compte). J'aimerais que ma table reste correcte (toujours les bonne BALANCE quelque soit mes opérations sur les champs ID ou AMOUNT. Le champ balance peut être un lecture seule.

Je vois 2 solutions:

1. Créer une VIEW (RULE) qui utilise la même table mais sans le champ BALANCE risque d'être très lent, car il faut faire un sum pour chaque entrée en lecture ? Si non, y'a t'il une bonne solution avex une vue ?

2. On peut utiliser la table telle quel et la garder consistante avec des TRIGGERS. Mais alors j'ai des problèmes de récursivité à cause des UPDATE.
La solution pour le INSERT et DELETE est simple:

create or replace function acc_trans_balance() returns trigger as '
begin
execute ''update transaction set balance=balance-'' || OLD.amount || '' where id>='' || OLD.id;
return NEW;
end ' LANGUAGE plpgsql;
CREATE TRIGGER acc_trans_balance_trig after DELETE ON transaction
FOR EACH ROW EXECUTE PROCEDURE acc_trans_balance();

Comment faire pour le UPDATE ?


3. Quelle est la meilleure solution: utiliser les vues mais être lent (ma table risque d'avoir pas mal d'entrées) ou utiliser les triggers et risquer de ne plus être constistent. (car une erreur dans une balane se propage, bien qu'on peut être sûr qu'il n'y a pas d'erreur)

Je ne suis pas assez doué un PLSQL et TRIGGER pour trouver la réponse.

D'avance merci à ceux qui peuvent m'aider.
  • # Re: Problèmes avec POSTGRESQL

    Posté par  . Évalué à 3.

    Hum, je ne veux pas venir mettre la pagaille, mais stocker la balance dans la base de donnée ne me semble être une bonne idée, ce ne sont pas des données, c'est simplement une valeur calculée. Est-il réellement nécéssaire de conserver la balance en permanence ?

    L'approche par vue oblige à recalculer toutes les valeurs même si on ne veut lire qu'une ligne de la table.

    L'approche par trigger est peut-être plus facile, mais cela veut dire recalculer toutes les valeurs à la moindre opération de modification (INSERT/UPDATE/DELETE).

    Sinon il faut envisager l'usage de procédure pour faire les modifications, et ne plus faire de INSERT/UPDATE/DELETE directement, la procédure, une fois l'opération effectuée, fait la mise à jour de toutes les balances d'ID supérieur à celle que l'on vient de modifier, ce n'est pas très compliqué. A placer dans une transaction bien évidement.
    • [^] # Re: Problèmes avec POSTGRESQL

      Posté par  . Évalué à 2.

      Je suis du meme avis, et j'ajouterais que ta base de donnée ne te garanti aucun ordre sur tes enregistrements (enfin c'est ce qu'on m'a appris ne theorie des bd en tout cas). Or si j'ai bien compris la balance n est la somme des n-1 ammounts... Si ton "id" est une sequence, ca risque d'etre sympa les calculs le jour ou elle boucle.

      Bon si tu y tient vraiment, moi je ferait avec une vue, mais entre l'order by sur les "id" ,la somme, et - comme precisé au dessus -, la transaction indispensable, c'est sur que ca va etre un peu lent...

      Bon je voulait pas mettre la pagaille non plus, mais je trouve que c'est pas une bonne idée non plus :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.