Hoe meer dan één virtuele valuta op te slaan in SQL

Ik heb een tabel met de naam gebruikers die op dit moment de kolom geld bevat van het type integer, dat de hoeveelheid geld bevat die de gebruiker momenteel heeft.

Ik zou echter graag uitbreiden en een aantal meer valuta's hebben die op elkaar zijn gebaseerd. 1 Goud = 10 Zilver = 100 Brons (of iets dergelijks). Als je 100 Bronze krijgt, zullen ze worden omgezet in 1 Gold. Hetzelfde met 10 Bronze = 1 Silver. Al deze valuta's hebben hun eigen kolom in mijn tabel. Ik heb een haakfunctie die bij elke aanvraag wordt aangeroepen en werkt het geld indien mogelijk bij.

Er is mij verteld dat ik slechts één kolom geld kan gebruiken en dan kan ik spelen met variabelen en de verschillende valuta's uitschakelen.

But my question is: What would be the best method?

In case the latter method is best: How do I put variables to an already existing object (an object which contains user data; I think it’s called stdClass or something like that)? $user->username, etc.?

1
Merk op dat de titel van uw vraag een beetje misleidend is (en een typefout bevat), omdat de vraag niet over 'echte' valuta's gaat. Voor echte valuta zou de relatie daartussen fluctueren en zou de vereiste oplossing anders zijn.
toegevoegd de auteur The Nail, de bron

5 antwoord

Bewaar het equivalente aantal brons. Gebruik vervolgens het volgende algoritme om zoveel mogelijk in goud omgezet te worden, van de rest zoveel mogelijk in zilver en de rest in brons:

  1. Stel het aantal goud in op nul, zilver op nul en brons op wat de database zegt.
  2. Stel het aantal zilver in dat gelijk is aan het aantal brons gedeeld door 10 (gebruik integer deling). Stel het aantal brons in dat gelijk is aan het aantal bronzen mod 10.
  3. Stel het aantal goud in dat gelijk is aan het aantal zilver gedeeld door 10 (gebruik integer delen). Stel het aantal zilver in dat gelijk is aan het aantal zilveren mod 10.

Dus als je 9.327 brons hebt:

  1. goud = 0, zilver = 0, brons = 9,327
  2. goud = 0, zilver = 932, brons = 7
  3. goud = 93, zilver = 2, brons = 7
4
toegevoegd
Is intval() de manier om ervoor te zorgen dat het een integer deling is?
toegevoegd de auteur John Svensson, de bron

Eén manier is om alleen alle valuta in Bronze op te slaan.

Op die manier als je 123 Bronze hebt, kun je ze omzetten

123/100   //Gold with integer division which should be 1

Remaining are 123 - NumGold * 100 ie 23

dus jij hebt

23/10 //Silver with integer division should be 2

Overig zijn 23 - NumSilver * 10 of 3 bronzen munten.

Dit was de SQL die alleen weet over bronzen munten en ze laat zien als goud, zilver zit allemaal in de applicatielaag

0
toegevoegd

Ik zou alles in brons veranderen en die waarde gewoon opslaan. Elke vorm van transacties zou ook eerst in brons worden omgezet. De enige keer dat je moet converteren naar zilver of goud zou voor weergave zijn.

0
toegevoegd

Ik heb al eerder iets soortgelijks gedaan en ik ben het ermee eens dat je gewoon de enige kolom voor 'geld' moet hebben en andere valuta moet berekenen als dat nodig is. Als u afzonderlijke kolommen had, zou u moeten vertrouwen op een trigger- of toepassingslogica om ze in synchronisatie te houden.

0
toegevoegd

Het geaccepteerde antwoord houdt geen rekening met waarden van meer dan 9999, omdat het 10 meer zal toevoegen aan zilver en een vals resultaat zal geven.

De beste oplossing is dit:

var bronze, silver, gold;
var myMoney = 32141;//number from database

bronze = myMoney % 10;
myMoney = (myMoney - bronze)/10;
silver = myMoney % 10;
gold = (myMoney - silver)/10;

Output:

gold = 321
silver = 4
bronze = 1
0
toegevoegd
Ik geloof dat dit gewoon pseudocode is voor het geaccepteerde antwoord. Ervan uitgaande dat / integer deling betekent.
toegevoegd de auteur Palec, de bron