Logikai változó tömböt hogyan tárolhatnék a legpraktikusabban MySQL adatbázisba?
Készítek egy játékot és arra gondoltam, hogy nem lokálisan, hanem távoli adatbázisban tárolnám a játékoshoz tartozó megszerzett mérföldköveket. A kérdés, hogyan lenne ezt praktikus tárolni?
Arra gondoltam, hogy a tömb elemeit integerként, vagy stringként tárolnám, és valahogy így nézne ki: "00110101", 0 jelenti a még nem teljesített feladatot, az 1-es pedig a teljesítettet.
Másik gondolatom, ami ebből származik, hogy ezt a bináris láncot átalakítom 10-es számrendszerbe és úgy mentem az adatbázisba, majd visszaolvasáskor kettesbe alakítva megkapom a mentett adatokat. Csak az aggaszt, hogy ha úgy mérföldköveket programozok a játékba, akkor több logikai érték lesz, így a lánc hossza is változik és ezáltal a korábbi változatban mentett értékek elcsúszhatnak.
Nincs erre valami elegáns, praktikus és egyszerű megoldás?
Az SQL adatbázis nem egy memória tömb. Az elgondolásod több szempontból is problémás.
Egy lehetőség: 3 tábla (séma). Egy amiben a felhasználóid vannak. Egy amiben a lehetséges mérföldkövek és egy amiben azt tárolod, hogy melyik felhasználó, melyik érföldkövet teljesítette már.
Azt hiszem ezt nevezik "0. normálformának": nem atomiak adattípusok.
Szerintem két táblád legyen, egyben az achievmenteket tárolod (ezt ugye idővel szabadon bővítheted), másikban pedig a játékos-achievment összerendeléseket. Többet tárhelyet foglal, de egyszerűbb, és szebb.
Vagy, ha mindenképpen egy rubrikába akarod tárolni, akkor (ahogy már ajánlották) hozz létre egy táblát, ahol tárolod az achievement-ket - kapjanak egy kettő hatványa alapú ID-t (1, 2, 4, 8, 16, 32, stb).
Majd a felhasználóknál bináros OR-al vedd egybe az értékeket, és mint INT tárold el a táblában.
Kiolvasáskor: ÉRTÉK AND ELLENŐRIZENDŐ == ELLENŐRIZENDŐ akkor azt már elérte a felhasználó. És ebben tudsz is keresni SQL-en keresztül is. Illetve, a jövőben bármikor adhatsz hozzá újabbakat és újabbakat, hiszen a régiek értéke nem fog változni.
Hátránya: az achievement száma korlátozott, hiszen nem tudsz bármekkora számot eltárolni egy INT-ben.
"Arra gondoltam, hogy a tömb elemeit integerként, vagy stringként tárolnám, és valahogy így nézne ki: "00110101", 0 jelenti a még nem teljesített feladatot, az 1-es pedig a teljesítettet."
Ha a játék során csak arra vagy kíváncsi, hogy egy adott játékos hol tart, akkor ez is teljesen jó. Javaslom, hogy int-ként tárold és a megfelelő bitet maszkold ki belőle. (Bár ennek a fajta helyspórolásnak már nincs nagyon értelme, hacsak nem többezer játékosod van.)
De ha azt is használnád, hogy pl. melyik mérföldkövet ki teljesítette, akkor a fenti kapcsolati tábla lehet jó, a játékosok és az eredmények között.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!