On dirait que Money
le type est déconseillé comme décrit ici
Mon application doit stocker de la monnaie. Quel type de données dois-je utiliser? Numérique, Argent ou FLOTTEUR?
Numérique avec une précision forcée de 2 unités. N'utilisez jamais float ou float comme type de données pour représenter la devise, car si vous le faites, les gens vont être mécontents lorsque le résultat final du rapport financier est incorrect de + ou - quelques dollars.
Le type d’argent n’est laissé que pour des raisons historiques, pour autant que je sache.
Votre source n'est en aucun cas officielle. Il date de 2011 et je ne reconnais même pas les auteurs. Si le type d'argent était "découragé", PostgreSQL le dirait dans le manuel - ce qui n'est pas le cas .
Pour une source plus officielle , lisez ce fil dans pgsql-general (à partir de cette semaine!) , avec les déclarations du noyau Les développeurs, y compris D'Arcy JM Cain (auteur original du type d'argent) et Tom Lane:
En gros, money
a ses utilisations (limitées). L'avantage sur numeric
est performance.
decimal
n'est qu'un alias pour numeric
dans Postgres.
Réponse associée (et commentaires!) Sur les améliorations apportées aux versions récentes:
Personnellement, j'aime bien stocker les devises en tant que integer
représentant des cents. C'est plus efficace que toutes les autres options mentionnées.
Vos choix sont:
integer
: enregistre le montant en cents. C'est ce que les transactions EFTPOS utilisent.decimal(12,2)
: enregistre le montant avec exactement deux décimales. C'est ce que la plupart des logiciels de grand livre utilisent.float
: idée terrible - précision insuffisante. C'est ce que les développeurs naïfs utilisent.L'option 2 est la plus courante et la plus facile à utiliser. Faites en sorte que la précision (12 dans mon exemple, soit 12 chiffres au total) soit la plus grande ou la plus petite qui vous convient le mieux.
Notez que si vous regroupez plusieurs transactions résultant d'un calcul (impliquant par exemple un taux de change) en une seule valeur ayant une signification commerciale, la précision doit être supérieure pour fournir une valeur macro précise. Pensez à utiliser quelque chose comme decimal(18, 8)
pour que la somme soit exacte et que les valeurs individuelles puissent être arrondies au cent près pour l'affichage.
Je garde tous mes champs monétaires comme:
numeric(15,6)
Cela semble excessif d'avoir autant de décimales, mais s'il y a la moindre chance que vous ayez à gérer plusieurs devises, vous aurez besoin de cette précision pour la conversion. Peu importe ce que je présente à un utilisateur, je stocke toujours en dollars américains. De cette façon, je peux facilement convertir en une autre devise, étant donné le taux de conversion pour la journée concernée.
Si vous ne faites jamais qu'une seule devise, le pire est que vous avez perdu un peu d’espace pour stocker des zéros.
bigint
Je recommande d'utiliser des micro-dollars (ou une devise majeure similaire). Micro signifie 1 millionième donc 1 micro-dollar = 0,000001 $.