Wygląda na to, że Money
typ jest odradzany, jak opisano tutaj
Moja aplikacja musi przechowywać walutę, jakiego typu danych mam używać? Numeryczne, Money czy FLOAT?
sql
postgresql
database-design
marzyciel
źródło
źródło
Odpowiedzi:
Numeryczne z wymuszoną dokładnością do 2 jednostek. Nigdy nie używaj typu danych typu float lub float do reprezentowania waluty, ponieważ jeśli to zrobisz, ludzie będą niezadowoleni, gdy wynik finansowy raportu finansowego będzie nieprawidłowy o + lub - kilka dolarów.
O ile wiem, typ pieniędzy został po prostu pozostawiony z powodów historycznych.
źródło
scale - precision
numeric(3,2)
będzie w stanie przechowywać max9.99
3-2 = 1
Twoje źródło nie jest w żaden sposób oficjalne. Pochodzi z 2011 roku i nawet nie rozpoznaję autorów. Jeśli typ pieniędzy był oficjalnie „odradzany”, PostgreSQL powiedziałby to w instrukcji - a tak nie jest .
Aby uzyskać bardziej oficjalne źródło , przeczytaj ten wątek w pgsql-general (tylko z tego tygodnia!) , Z oświadczeniami głównych programistów, w tym D'Arcy JM Cain (pierwotny autor typu pieniężnego) i Toma Lane:
Powiązana odpowiedź (i komentarze!) Na temat ulepszeń w ostatnich wersjach:
Zasadniczo
money
ma swoje (bardzo ograniczone) zastosowania. PlikPostgres Wiki sugeruje, aby w znacznym stopniu uniknąć, z wyjątkiem ściśle określonych przypadków. Przewaganumeric
jest wydajność .decimal
jest tylko aliasem dlanumeric
w Postgres i jest szeroko stosowany w danych monetarnych, będąc typem „arbitralnej precyzji”. Instrukcja :Osobiście lubię przechowywać walutę jako
integer
reprezentującą centy, jeśli ułamkowe centy nigdy nie występują (w zasadzie tam, gdzie pieniądze mają sens). To jest bardziej wydajne niż jakakolwiek inna z wymienionych opcji.źródło
money
typ był w rzeczywistości przestarzały. Problemy zostały naprawione, a typ został dodany z powrotem w późniejszych wersjach. Osobiście lubię przechowywać walutę jakointeger
centy.Masz do wyboru:
bigint
: zapisz kwotę w centach. Tego właśnie używają transakcje EFTPOS.decimal(12,2)
: zapisz kwotę z dokładnie dwoma miejscami po przecinku. Tego właśnie używa większość programów do obsługi księgi głównej.float
: okropny pomysł - niewystarczająca dokładność. Właśnie tego używają naiwni programiści.Opcja 2 jest najpopularniejsza i najłatwiejsza w użyciu. Ustaw dokładność (w moim przykładzie 12, co oznacza w sumie 12 cyfr) tak dużą lub małą, jak najbardziej Ci odpowiada.
Zwróć uwagę, że jeśli agregujesz wiele transakcji, które były wynikiem obliczeń (np. Dotyczących kursu wymiany), w jedną wartość, która ma znaczenie biznesowe, precyzja powinna być wyższa, aby zapewnić dokładną wartość makro; rozważ użycie czegoś podobnego,
decimal(18, 8)
aby suma była dokładna, a poszczególne wartości można było zaokrąglić do centów dokładności w celu wyświetlenia.źródło
numeric(15,4)
lubnumeric(15,6)
to dobry pomysł.Wszystkie pola pieniężne zachowuję jako:
numeric(15,6)
Wydaje się przesadą, aby mieć tyle miejsc po przecinku, ale jeśli istnieje choćby najmniejsza szansa, że będziesz musiał radzić sobie z wieloma walutami, potrzebujesz tak dużej precyzji do przeliczania. Bez względu na to, co przedstawiam użytkownikowi, zawsze przechowuję dane w dolarach amerykańskich. W ten sposób mogę łatwo przeliczyć na dowolną inną walutę, biorąc pod uwagę kurs wymiany na dany dzień.
Jeśli nigdy nie robisz nic poza jedną walutą, najgorsze jest to, że zmarnowałeś trochę miejsca na przechowywanie zer.
źródło
Użyj 64-bitowej liczby całkowitej przechowywanej jako
bigint
Zalecam używanie mikro dolarów (lub podobnej głównej waluty). Mikro oznacza 1 milionową, więc 1 mikrodolar = 0,000001 $.
źródło
numeric(15,6)
zasugerowano w innej odpowiedzi?bigint
. Istnieje developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ... ale ma ograniczone wsparcie (na razie) i zastrzeżenia (np. Nie można go łatwo pomnożyć przez liczbę zmiennoprzecinkową podczas przeliczania walut) . Biorąc pod uwagę, że maksymalna wartość, jaką można zapisać w postaci liczby całkowitej JS za pomocą mikro-dolarów, wynosi 9 miliardów dolarów, co prawdopodobnie nadal jest dobre w większości przypadków.Służy
BigInt
do przechowywania waluty jako dodatniej liczby całkowitej reprezentującej wartość pieniężną w najmniejszej jednostce walutowej (np. 100 centów do przechowywania 1,00 USD lub 100 do przechowywania jenów 100 (jen japoński, waluta o zerowej wartości dziesiętnej). To właśnie robi Stripe - jeden najważniejszych firm świadczących usługi finansowe dla globalnego handlu elektronicznego.źródło