System.Decimal non si sposa bene coi NoSQL

Eccoci ad un altro problemino da tener presente quando si va sul cloud o più in general su vari motori NoSQL: System.Decimal non si sposa molto bene.

I 3 motori scelti per il test drive sono:

  • Azure Table Storage
  • Amazon SimpleDB
  • MongoDB

Tutti e tre non supportano il tipo System.Decimal, quindi se volete salvare valute, cambi, grandi valori con virgola, dovrete ingegnarvi un po’. Noi per ora abbiamo usato il tipo double per le prove, durante le comunicazioni con terminali di pagamento reali solitamente si usa il protocollo ISO8583 dove il numero è diviso in due parti:

  • Amount: l’ammontare completo parte intera e mantissa senza virgola (esempio 100,91 è 10091)
  • MinorUnit: numero di cifre decimali (esempio su 100,91 è 2)

Di seguito i tipi supportati dai vari sistemi:

Tipo Azure Table Storage Amazon SimpleDB MongoDB
byte[] X   X
bool X   X
DateTime X   X
double X   X
Guid X   X
Int32 o int X   X
Int64 o long X   X
String X X (max 1024 bytes) X
regex     X

 

Da notare che Amazon ha scelto un’implementazione tecnica semplice per il suo NoSQL, che però comporta il fatto che tutti I valori vengano salvati come stringhe con una dimensione massima limitata e la ricerca è lessicografica il che significa che per SimpleDB 10 viene prima di 2, quindi bisogna porre un po’ di attenzione in più: http://aws.amazon.com/articles/1232

Nota: è sempre possibile utilizzare un handler per gestire l’evento di Reading/Writing durante l’interazione con i NoSQL sopra. Magari ne parleremo in un post futuro.

Alla prossima!