2008-10-22 5 views
2

J'expérimente avec une application de finances personnelles, et je réfléchis à l'approche à adopter pour mettre à jour les soldes en cours lors de la saisie d'une transaction dans un compte. Actuellement, la façon dont j'utilise consiste à récupérer tous les enregistrements plus récents que ceux insérés/modifiés, et à les augmenter un par un en augmentant leur solde.Comment mettre à jour une valeur de colonne de manière incrémentielle

Par exemple, compte tenu des opérations suivantes:

date t1 = 2008-10-21, quantité = 500, en cours d'exécution balance = 1000

date t2 = 2008-10-22, quantité = 300, solde courant = 1300

date t3 = 2008-10-23, montant = 100, solde courant = 1400 ...

Supposons maintenant que j'insère une transaction entre t1 et t2, puis t2 et toutes les transactions ultérieures aurait besoin de leur annonce de soldes de fonctionnement juste.

Hehe, maintenant que je l'ai écrit cette question, je pense que je connais la réponse ... donc je vais le laisser ici au cas où il aide quelqu'un d'autre (ou peut-être il y a même une meilleure approche?)

Première , Je reçois le solde de la transaction précédente, dans ce cas, t1. Ensuite, mettre à jour toutes les transactions suivantes (qui comprendrait le nouveau):

UPDATE transactions 
SET running_balance = running_balance + <AMOUNT> 
WHERE date > <t1.date> 

Le seul problème que je vois est que maintenant au lieu de stocker uniquement une date, je vais devoir stocker un temps aussi. Bien, que se passerait-il si deux transactions avaient exactement la même date/heure? PS: Je préférerais des solutions n'impliquant pas de fonctionnalités propriétaires, car j'utilise PostgreSQL et SQLite ... Bien qu'une solution Postgre seule serait également utile.

Répondre

0

Je pense que cela pourrait fonctionner:

j'utilisais la date et l'identifiant de commander les opérations, mais maintenant je vais stocker la date et l'identifiant sur une colonne, et l'utiliser pour commander. Donc, en utilisant des comparaisons (comme>) devrait toujours fonctionner comme prévu, non? (par opposition à la situation que je décris plus haut où deux colonnes ont le datetime exact (aussi improbable que ce soit).

2

Une sorte de colonne Identité/Auto-incrémentation là-dedans serait également judicieuse, uniquement pour l'ordre de transaction.

En plus de la date de la transaction, une date à laquelle la transaction est insérée dans la base de données (pas toujours la même chose) serait également utile/utile. Ce genre de choses vous aide simplement à arranger les choses dans le système et facilite le changement de choses, c'est-à-dire pour les transactions, à un moment ultérieur.

+0

Je pensais aussi à la colonne d'identité, mais le problème est que si je déplace une transaction dans le temps, l'identifiant ne serait d'aucune utilité. Je pense que ce serait le même problème avec une colonne "created_on" ne pensez-vous pas? Ou je ne vous suis pas? – Ivan

+0

Trier par. Le point principal de la colonne d'identité et/ou de la colonne created_on serait de vous permettre de voir l'ordre réel des choses créées indépendamment de la date de transaction que vous lui avez donnée. Cela vous permettra également de vous assurer que votre logique est correcte pour mettre à jour les autres lignes aussi. –

+0

Je suis désolé, je ne comprends toujours pas. J'ai une colonne d'identité, mais je ne pense pas qu'il soit utile de savoir dans quel ordre les transactions ont été créées car ce qui compte est la colonne de date réelle. Pourriez-vous élaborer un peu plus sur comment pourrais-je l'utiliser pour résoudre ce problème? Merci. – Ivan

0

Si vous avez un volume important de transactions, il est préférable de stocker le solde courant par date ou même par semaine/mois dans un tableau séparé. Si vous insérez des lignes à la même date, il vous suffit de modifier la balance courante sur une ligne. L'interrogation et la création de rapports seront plus délicates car si vous utilisez ce solde, vous devrez obtenir des soldes après chaque transaction. Cela équivaudrait à prendre le solde des derniers jours et à ajouter ou soustraire la valeur de la transaction.

Questions connexes