noSQL - È un'opzione valida per i giochi basati sul web? [chiuso]


20

Per un'opportunità e una noia, un amico e io abbiamo deciso di creare un gioco basato sul web. Questo è il primo "gioco" che farò, dato che di solito programma applicazioni web in django.

Ho scelto di utilizzare lo stesso framework per il gioco, ma non sono completamente sicuro dell'archiviazione dei dati, dal momento che non posso prevedere requisiti futuri e problemi relativi al DB. Ultimamente, il movimento noSQL sta guadagnando forza e vorrei esplorare quell'area.

Pertanto ho le seguenti domande:

  • Un datastorage noSQL (basato su documenti, come MongoDB) sarebbe adatto per un gioco basato sul web?
  • Quali sono i problemi che potrebbero sorgere utilizzando un RDBMS convenzionale, come MySQL?
  • Come assicurare la coerenza dei dati assicurativi tra gli utenti con MongoDB, durante il gioco o in occasione di eventi a tempo, come cron job?

Panoramica del gioco: tipico gioco di avventura, con il giocatore che combatte mostri e guadagna oggetti e simili.

  • Alcuni dati sono statici per tutti i giocatori: oggetti, armi, pozioni, mappe, ecc.
  • Alcuni dati legati al giocatore: inventario, metriche (statistiche), progressi, ecc.
  • Un giocatore potrebbe aver bisogno di conoscere le statistiche e lo stato di un altro giocatore
  • Le attività pianificate verranno eseguite a un certo intervallo di tempo


1
Un problema con alcuni database noSQL è che non possono eseguire query senza preavviso in fase di "progettazione" in modo rapido su enormi set di dati come i registri eventi: gamedev.stackexchange.com/q/4465/450 Tenere presente che i database noSQL richiedono lo stesso tecniche contro l'iniezione di query normali rispetto ai normali database.
Hendrik Brummermann,

1
@nhnb: Un bel modo di riaffermare il tuo punto è "usa un database relazionale per i dati di relazione e usa un database di oggetti / documenti per dati di oggetti / documenti". Sfortunatamente non penso che la maggior parte delle persone abbia esperienza o trascorra molto tempo a pensare alla modellazione, il che porta a cattivi progetti indipendentemente dalla scelta.

2
In risposta alla tua domanda "NoSQL è un'opzione valida per i giochi basati sul web?" Credo che la risposta sia sì. I database NoSQL sono già stati utilizzati per giochi basati sul Web (come FarmVille) e offrono molta flessibilità. Il principale punto di contesa per questa domanda sembra essere "qual è il migliore (NoSQL o SQL)?". Ogni sistema ha pro e contro, ma entrambi sono opzioni perfettamente legittime. Se stai cercando un elenco dettagliato dei vantaggi di un sistema rispetto all'altro, potresti voler pagare una visita ai programmatori StackExchange. :)
Ari Patrick

Risposte:


21

Un database noSQL sarebbe adatto per un gioco basato sul web?

Assolutamente! In generale, i database non relazionali (come MongoDB) sono molto migliori per i giochi, in quanto sono più flessibili nel modo in cui modellano i dati, pur essendo più performanti dei database relazionali (come SQL), rendendoli un "win-win" scelta.

Quali sono i problemi che potrebbero sorgere utilizzando un RDBMS convenzionale?

Esistono due principali svantaggi nell'utilizzo dei database relazionali:

  • Mancanza di flessibilità nel modo di modellare i dati
  • Prestazione

La mancanza di flessibilità nel modo in cui si modellano i dati è un grosso svantaggio, perché l'uso di un database relazionale ti costringe a modellare i dati per adattarli alle esigenze del database, piuttosto che al database che soddisfa le esigenze del modello. Ad esempio, considera di creare il modello per la modalità di archiviazione degli oggetti in un gioco utilizzando un database relazionale e decidi il modello seguente:

weapon_type_id | weapon_type
1 | sharp

weapon_id | weapon| weapon_type_id | damage
1 | Short Sword | 1 | 5

potion_type_id | potion_type
1 | HP
2 | Mana

potion_id | potion| potion_type_id | modifier
1 | Healing Elixer | 1| 5
2 | Mana Drainer | 2| -5

Ora considera come dovresti modificare il modello per soddisfare le seguenti esigenze:

  • Aggiungi un nuovo tipo di elemento
  • Crea un'arma con più tipi di armi
  • Crea un oggetto pozione che può essere usato anche come arma

Certamente tutte queste azioni sono realizzabili, ma non sarai la persona più felice mentre le stai facendo, e probabilmente ti chiederai "esiste una soluzione migliore per quello che voglio fare?", Quando puoi progettare un modello molto più flessibile in un database non relazionale.

Nota: se non si ha familiarità con il modo in cui i database basati su documenti archiviano le informazioni, consultare questo collegamento prima di continuare. Il modello presentato di seguito è progettato per utilizzare una logica simile a quella presentata nel suddetto articolo.

db.itemTypes

name: Weapon
types: Sharp

name: Potion
types: HP, Mana

db.items

name: Short Sword
weapon
    type: Sharp (db.itemTypes reference)
    damage: 5

name: Healing Elixer
potion
    type:  HP (db.itemTypes reference)
    modifier: 5

name: Mana Drainer
potion
    type:  Mana (db.itemTypes reference)
    modifier: -5  

name:  Healing Potion Sword
potion
    type: HP (db.itemTypes reference)
    modifier: 10
weapon
    type: Sharp (db.itemTypes reference)
    damage: 15

Ci sono molti buoni articoli sulle prestazioni dei database NoSQL vs SQL, ma eccone uno che fornisce esempi di applicazione in modo da poter eseguire i propri test: MongoDB vs SQL Server 2008 Performance Showdown

Come posso assicurare la coerenza dei dati tra gli utenti con MongoDB?

MongoDB supporta operazioni atomiche di lettura / scrittura su singole entità di dati (documenti), quindi i risultati delle query da MongoDB dovrebbero essere sempre precisi con ciò che è memorizzato nel database.

Modifica: fornito esempio NoSQL del database degli articoli


Nell'esempio che hai scritto usando sql, come lo modelleresti ad alto livello usando nosql?
Pran,

4
-1, la tua risposta mostra solo dati statici. L'intero dibattito su SQL vs NoSQL per i database di giochi riguarda dati altamente dinamici. La cosa migliore da fare sarebbe mostrare una transazione NoSQL che scambia qualcosa tra due giocatori - un evento molto comune e uno della maggior parte dei giochi si sbagliano indipendentemente dal tipo che scelgono.

3
@Ari: ci sono molti più dati statici, ma nessuno si preoccupa del throughput per le scritture su di esso, perché nessuno ci scrive - nessuna scrittura, nessuna transazione, nessun ACID, nessuna vera domanda sul database, anche se ti capita di archiviarlo in uno. A questa domanda è quindi facile rispondere: tienilo in memoria. Certamente "Come possiamo caricare i dati statici più velocemente?" è una domanda interessante, ma non credo che sia affatto correlato alle domande di SQL vs. NoSQL. - Per quanto riguarda le operazioni multi-documento, questo significa che il tuo database avrebbe un documento con ad esempio tutti i giocatori?

2
@Ari: Per favore, non confondere NoSQL, che è un'idea, e MongoDB, che è un database particolare. Nel mio ultimo lavoro abbiamo distribuito due giochi su un database NoSQL e abbiamo ottenuto un'ottima concorrenza con bassa latenza. Ma il nostro database NoSQL supportava anche transazioni multi-documento con blocco a livello di campo. NoSQL non è una sola "cosa" come SQL, si riferisce solo a qualsiasi database che non utilizza SQL (e di solito non utilizza schemi relazionali).

5
Solo il mio $ 0,02, ma "non performante" non è uno svantaggio di RDBMS. È uno svantaggio di archiviare dati non relazionali in un RDBMS, non ottimizzare il tuo RDBMS, non capire cosa sta facendo il tuo SQL, non indicizzare, ecc. Ecc. Ecc. Se hai dati relazionali, scoprirai che gli RDBMS sono incredibilmente ottimizzati.
Robbie,

19

Un paio di parole difendono i database SQL.

1 - Se si dispone di un database SQL, è possibile lavorare con i dati non solo tramite chiave primaria. La maggior parte delle query in MMO viene eseguita da PK, ma quando devi trovare tutti gli utenti con livello> 30 cosa farai nel mondo NoSQL?

2 - Se si dispone di un linguaggio SQL, è possibile creare "hotfix" per riparare i dati non funzionanti. Ad esempio: "aggiorna player_items set flag = 0 dove item_type_id = 100". Come puoi risolvere questo problema con NoSQL? Penso che dovrai creare uno script che analizzerà tutti i tuoi dati ...

3 - I database SQL non sono così lenti come puoi pensare. I miei colleghi creano il gioco MMO basato sul web, che effettua 5000 transazioni al secondo in MySQL. Non è abbastanza per te? In caso contrario, è possibile utilizzare lo sharding per ridimensionare il database.

4 - SQL ha un vincolo di chiave esterna e cose così buone, che ti aiuteranno a trovare bug nel tuo codice.

NoSQL non è un proiettile d'argento. Risolve solo un paio di problemi e porta molti nuovi problemi. Quindi il mio consiglio: pensaci due volte prima di scegliere NoSQL.


1
Questi sono tutti ottimi motivi per evitare NoSQL fino a quando non ne hai davvero bisogno. Soprattutto # 3. A meno che tu non abbia già miliardi di utenti (e rifiuti di frammentare qualsiasi cosa), probabilmente sarai molto più produttivo con MySQL.
ojrac,

5
1. Utilizzeresti: "for x in db.user.find ({" level ": {" $ gt ": 30}})" 2. Tecnicamente, anche quello che hai scritto è uno script, quindi sono non sono sicuro di quale sia il tuo punto. 3. È MOLTO possibile creare un MMO usando SQL, e in effetti molti MMO sono stati sviluppati usando la tecnologia. La tecnologia NoSQL è abbastanza nuova ed è già stata adottata da servizi come Amazon, Google e Facebook per le sue prestazioni e flessibilità. 4. In NoSQL dovresti scrivere i tuoi vincoli, ma questo è semplicemente il costo di una maggiore flessibilità.
Ari Patrick,

2
Sono d'accordo con la tua dichiarazione di pensiero due volte. Questo è in parte quello che sto facendo qui con questa domanda :)
Pran

10
SQL non è un proiettile a nastro. NoSQL non è un proiettile d'argento. Pensaci due volte prima di utilizzare qualsiasi tecnologia.
Stonemetal

5
Per quanto riguarda 3, il problema non è tanto che SQL è lento , ma che SQL è in ritardo . In generale, i database SQL ottengono un throughput eccellente a spese della latenza. Per un gioco basato sul web, è probabilmente quello che vuoi! Per un gioco in rete in tempo reale, probabilmente non lo è, e la maggior parte degli MMO "WoW-like" che usano SQL utilizzano uno strato di cache di fronte che rimuove la maggior parte dei vantaggi di SQL, motivo per cui NoSQL è un grande passo avanti per loro.

18

La risposta è sì, è un'opzione valida ma no, probabilmente non è una grande idea .

Esistono due problemi principali con SQL che NoSQL tenta di risolvere quando si tratta di giochi.

Il primo è latenza o ritardo. In un certo senso, i database SQL sono incredibilmente veloci, elaborando migliaia di transazioni o più in decimi di secondo. In un altro senso, sono incredibilmente lenti, perché l'elaborazione di poche transazioni può richiedere lo stesso tempo. Per la maggior parte degli utilizzi del database, questo non ha importanza, ma i giochi hanno un componente in tempo reale, quindi non si tratta solo di quante transazioni puoi fare al secondo, ma del tempo medio impiegato per rispondere a una transazione del database.

Questa latenza è un grosso problema per i giochi in tempo reale. Molti sviluppatori che necessitano di database di grandi dimensioni (in genere per MMO) creano un livello di memorizzazione nella cache che si trova tra il database e i server di gioco per evitare queste bancarelle e quindi svuotare periodicamente la cache. Il problema? Hai appena eliminato i motivi principali per utilizzare un database: atomicità, coerenza, isolamento e durata .

Ma quel problema non si applica ai giochi web. Hai già una connessione ad alta latenza tra il giocatore e il gioco, quindi potresti anche ottenere il throughput fornito da SQL, nonché i vantaggi di un software maturo e ben noto.

Il secondo problema, tuttavia, si applica a te, e questa è la discrepanza di impedenza relazionale oggetto . I giochi si occupano di oggetti, i database si occupano di file. Se sei fortunato, un oggetto può essere trasformato in una riga semplicemente elencando i suoi campi, ma la maggior parte delle volte gli oggetti sono gerarchici e devi appiattirli in qualche modo per metterli in righe.

Database basati su documenti, come CouchDB e MongoDB, risolvono questo problema promuovendo il documento sull'oggetto di livello superiore, anziché sulla riga ("documento" in questo caso è sinonimo di "oggetto"). In questo modo, perdono molti dei vantaggi dei database SQL. Il throughput è molto più basso e gli algoritmi di blocco diventano molto più complicati.

La buona notizia è che ci sono già molti strumenti di mappatura relazionale a oggetti (ORM) disponibili per qualsiasi linguaggio tu stia usando. Ti consentono di tradurre tra oggetti in memoria e righe nel database in modo abbastanza trasparente. Questi strumenti non sono generalmente appropriati per i giochi in tempo reale su larga scala, perché possono presentare gli aspetti peggiori delle prestazioni dei database SQL e NoSQL. Ma va bene per un gioco Web - nel peggiore dei casi, quando si verificano problemi di prestazioni, è possibile tornare a fare transazioni alla vecchia maniera. Il problema di latenza non ti danneggia e la maggiore produttività ti aiuta.

Infine, per sostenere un punto che ho sottolineato altrove : non si tratta di dati di gioco statici. Non sto parlando delle descrizioni dei tuoi oggetti o del danno dell'arma o degli sprite o altro qui. Intendo i dati di gioco reali e mutevoli, come quelli che sono nell'inventario di un giocatore o quali sono le sue statistiche. Tutto ciò che serve per i dati statici è un archivio dati. Forse si scopre che la cosa più semplice da fare è usare lo stesso database dell'archivio dati perché hai un ORM eccezionale; forse avrai solo bisogno del filesystem. Sono due problemi distinti e una risposta non deve (e probabilmente non si adatta) ad entrambi i casi.


1
+1 Grazie per il confronto di entrambe le opzioni. Inoltre, fai un buon punto dicendo che i dati statici non dovrebbero essere nel database.
Pran,

1
+1 Tuttavia, penso che trascuri di menzionare uno dei principali pro (beh, pro o contro a seconda della prospettiva) di No SQL, ovvero che è privo di schemi, che consente l'archiviazione di dati altamente dinamici. In realtà userò un mix di entrambi per il mio attuale progetto con PostgreSQL per cose che si adattano perfettamente al modello relazionale, e Mongo per cose semi-statiche che non lo fanno. (ad esempio un registro che può essere utilizzato per generare un replay, dove relazionalmente dovrei avere una colonna che memorizza un PK da una di molte altre tabelle o una tabella con nomi di colonne generici, ad esempio param1 param2)
Davy8

1
@ Davy88: noSQL non è necessariamente privo di schemi e avere un database "altamente dinamico" non è davvero un vantaggio. Se tutto ciò che hai è una minestra di dati, non puoi eseguire l'indicizzazione, non puoi eseguire il blocco a livello di campo e anche le semplici query diventano piene di domande su cosa succede se non esiste una chiave.

@ user744, cosa compiono quelle cose che menzioni?
expiredninja,

5
  • Un datastorage noSQL (basato su documenti, come MongoDB) sarebbe adatto per un gioco basato sul web?

Consiglio di dare un'occhiata a couchdb

La sua interfaccia è basata su javascript, quindi si fonderà abbastanza bene con i giochi basati su HTML5 / javascript.

È anche in grado di funzionare "off-line" (creando una copia locale del db) e quindi sincronizzarsi con il server in un secondo momento (ad esempio, è possibile utilizzarlo per i dungeon istanziati)

  • Quali sono i problemi che potrebbero sorgere utilizzando un RDBMS convenzionale, come MySQL?

Il problema principale sarebbe che i database no-sql gestiscono in modo abbastanza diverso dai database relazionali. Fare il passaggio mentale può essere difficile.

Ad esempio, dai un'occhiata a come vengono eseguite le " query " in couchdb. Tutto è fatto in JavaScript.

  • Come assicurare la coerenza dei dati assicurativi tra gli utenti con MongoDB, durante il gioco o in occasione di eventi a tempo, come cron job?

Il processo di "sincronizzazione" dei database è chiamato replica nel gergo di couchdb. Vedrai anche il termine coerenza molto. Esistono diversi servizi integrati che si occupano di replica e coerenza. Vedere ad esempio il processo di replica incrementale .


Sì, ho sentito parlare anche di couchdb, infatti, anche sul sito web del mongodb, fanno comunemente paragoni con esso. Penso di dover fare ricerche su couchdb vs mongodb.
Pran,

2

A seconda di ciò che hai nel gioco, potresti finire per usarli entrambi e collegarli attraverso i modelli del gioco. Ad esempio, il lettore potrebbe e dovrebbe trovarsi in RDB (informazioni di accesso) ma l'inventario del giocatore / l'archiviazione variabile potrebbe passare a noSQL, quindi il modulo del lettore potrebbe login()utilizzare RDB e fetchInventory()utilizzare noSQL dalla chiave primaria.

Mappe per esempio migliori per essere salvate in NoSQL (coordinate => array di oggetti diversi per esempio) non immagino di salvare ciò che un'area contiene in RDB (tranne una stringa serializzata che è necessario annullare la serializzazione completa per leggere alcune parti di? Più CPU e RAM sprecata!) bene potresti comunque salvare aree in RDB, ad esempio l'area "città X" contiene i seguenti coordinate / blocco ([3,4], [8,7] ...)

potresti e probabilmente dovresti usare entrambi e dare un'occhiata all'archiviazione volatile come memcache di cui potresti aver bisogno o alcuni dati temporanei (sarebbe sicuramente più veloce dell'uso del disco rigido e ti risparmia molta CPU ma sicuramente non RAM)

così alla fine>

dipende da cosa vuoi avere nel tuo gioco! Cheerz


quali caratteristiche pensi che ti trascinerebbero di più in NoSQL o nel livello di persistenza come mi piace pensarci?
expiredninja,

1
forse un sistema di coordinate se il tuo gioco è basato su gps, qualcosa che potrebbe richiedere una ricerca avanzata. fondamentalmente se sei bravo con MySQL e poi attenersi ad esso, è possibile usarlo anche come nosql
Ronan Dejhero
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.