Wat @wimmpie ook zegt: enerzijds gebruik je "users" (wat mij een tabel lijkt) en vervolgens "users.data". Heb je echt een (aparte?) database genaamd "users" en vervolgens een tabel genaamd "data"?
Als je veelvuldig verschillende gegevens van eenzelfde gebruiker opvraagt zou ik hier niet allemaal aparte queries voor schrijven, je kunt in één query prima alle (relevante) data ophalen van een gebruiker, zelfs als deze verspreid is over meerdere tabellen. En deze dan bijvoorbeeld in een hulp-array of User-object opslaan zodat je hier vervolgens aan kunt refereren.
Maar hoe je dit precies doet hangt ook af van:
- hoe deze data er uitziet (structuur)
- en wat je er mee wilt doen
Ik zie daar dingen als "bank" en "cash" voorbij vliegen. Wanneer je informatie opvraagt met als doel deze te veranderen dan is het belangrijk dat de informatie na opvragen (tijdelijk) read-only wordt tot (en na) het moment van het bijwerken van deze data. Als je dat niet doet dan kunnen er dingen fout lopen.
Stel bijvoorbeeld dat er 2 operaties bestaan in jouw applicatie die het volgende doen:
- geld storten
- geld opnemen
Stel dat jouw saldo 200 is.
Vervolgens worden er tegelijkertijd twee operaties uitgevoerd:
- 200 opnemen
- 50 storten
Wat is dan volgens jou het eindsaldo? 50 toch he?
Nou niet dus :). Althans niet als je je startsaldo eerst overhevelt naar een hulpvariabele en dan pas de bewerkingen uitvoert. Er kunnen dan -zonder speciale voorzieningen- meerdere eindantwoorden mogelijk zijn afhankelijk van de volgorde waarin de acties worden uitgevoerd. Het is mogelijk dat de einduitkomst een van de volgende waarden heeft:
50 (dit is wat we willen)
250 (dit is wat we niet willen)
Hoe komen we tot 250?
Noem 200 opnemen A
Noem 50 storten B
Dit is wat er achtereenvolgens zou kunnen gebeuren (A en B vinden "tegelijkertijd" plaats):
A vraagt saldo op: 200
B vraagt saldo op: 200
A neemt 200 op, eindsaldo volgens A: 0
B stort 50, eindsaldo volgens B: 250
Wanneer B voor de opname van A het saldo opvraagt en na het wegschrijven van het eindsaldo van A dit zelf doet heb je een niet-kloppend eindantwoord. Dit was mogelijk omdat er geen "lock" is op de waarde van het saldo. Normaal regel je dit met een voorziening in de database waarmee je gegevens tijdelijk kunt vergrendelen zodat slechts één proces deze data kan aanpassen. Beter bekend als een database-transactie. Net zoals een monetaire actie eigenlijk: alle stappen vormen tezamen één ondeelbare actie. Anders gebeuren er mogelijk rare dingen, zoals hierboven omschreven.
Daarom kan ik niet op voorhand zeggen hoe jij je data in PHP moet organiseren omdat ik niet weet hoe je hier in je database mee omgaat.