Achievement System CRUD struttura dati

2

Sto sviluppando questo Achievement System e deve avere un CRUD, che ammette l'accesso per creare nuovi risultati e le sue regole. Ho bisogno di aiuto con la struttura dei dati CRUD di Achievement.

Esempio di regole

Medal one : devi completare 5 corsi con un punteggio di almeno 90
Medal two : devi completare due corsi specifici con un punteggio di almeno 85
Medaglia tre : deve essere il primo 5 nella classifica generale almeno una volta
Medaglia quattro : deve avere più di 5000 punti

Lo memorizzerò in un database SQL e ho pensato a due opzioni.

Opzione A

Crea una tabella con poche colonne come sotto per memorizzare quelle più variabili quando adatto:

  • azione
  • quantità di azione
  • quantità di corso
  • punteggio
  • id course
  • classifica Posizione
  • punti

Opzione B

Memorizza che usando JSON o il formato serializzato, quindi tutta la logica di analisi che si trova nel mio codice, al rovescio della medaglia, renderà più complesso interrogare alcune regole (non sono sicuro che avrò bisogno di interrogarlo, ma mi piace essere pronto per ogni evenienza).

Tenete presente che c'è un'alta probabilità che dovrò aggiungere più regole a questo sistema, ecco perché lo sto chiedendo.

Esiste un modo più adatto per farlo, forse uno schema di progettazione, una soluzione nota o qualcosa già creato per questo scenario?

    
posta Edson Horacio Junior 19.12.2018 - 18:57
fonte

1 risposta

1

Ci sono due approcci generali qui, per i quali devi prima chiarire i requisiti:

  1. Supporta solo un set limitato di regole o tipi di regole predefinite. Se è necessario estendere i tipi di regole, alcuni altri programmatori devono estendere il sistema aggiungendo codice e distribuendo una nuova versione.

  2. Supporta regole quasi arbitrarie e gli utenti possono estenderle da sole.

Immagino che questo sia ciò che hai in mente con le tue opzioni A e B - ma spero che la mia descrizione chiarisca che questa non è una questione di "schemi di progettazione" - è semplicemente una questione di requisiti " Chi sarà in grado di estendere le regole? ".

Quindi, dato che hai davvero bisogno di un sistema in cui gli utenti possano estendere le regole da solo, puoi memorizzarle come coppie di "espressione booleana" e "ricompensa". L'espressione booleana sarebbe una formula con alcune funzioni predefinite come blocchi predefiniti, operatori logici "e", "o", "non" e operatori di confronto, usati come

  $NoOfCoursesAboveLimit(90) >=5 

  $ScoreOfCourse("X")>85 and $ScoreOfCourse("Y")>85

  $RankingPosition()<=5

  $TotalScore()>=5000

Quindi non sono coinvolti fantasiosi "JSON" o "formati di serializzazione", solo un sottoinsieme o una modifica del tuo linguaggio di programmazione preferito, qualcosa come amico-utente come le formule possono essere.

Ovviamente, questo approccio richiede probabilmente più sforzi per essere implementato rispetto al primo. È necessario definire una grammatica, quindi implementare un parser e infine un valutatore di espressioni insieme alla logica per quelle funzioni predefinite.

Fortunatamente, questo non è un nuovo problema. Per il caso descritto, qualcosa come l'algoritmo Shunting-yard dovrebbe essere sufficiente per l'analisi. La fase di valutazione finale sta quindi attraversando solo l'albero di sintassi astratto creato dal parser.

    
risposta data 20.12.2018 - 08:05
fonte

Leggi altre domande sui tag