Sto costruendo un'applicazione line-of-business supportata da database relazionale per il mio cliente di consulenza (o meglio, la sto riscrivendo - lunga storia). Questo prodotto software è un servizio SaaS per un settore di nicchia. In questo caso, per quanto ci riguarda, si tratta di un sistema che gestisce i report per le marmotte di bosco - genera report di woodchucking per ogni marmotta utilizzata da un'organizzazione di woodchucking.
Il mio cliente è molto desideroso di aggiungere elementi di gamification al sistema, in particolare vorrebbe aggiungere un sistema di risultati che può essere facilmente esteso senza la necessità di aggiungere regole una tantum alla base di codice esistente (un C # 6.0 ASP.NET 4.6 .1 Applicazione MVC 5, con un database SQL Server multi-tenancy). Fondando le cose, il database ha altre applicazioni dipendenti, quindi non posso cambiare lo schema del database senza una buona ragione. Ciò complica il problema di dover archiviare arbitrariamente altri piccoli pezzi di dati, dato che sarà necessaria almeno una qualche forma di integrità referenziale.
Come parte, personalmente sostengo l'aggiunta di un tale sistema perché guida il coinvolgimento dell'utente e guida l'utente verso l'uso appropriato del sistema, nel caso in cui riteniamo che una particolare caratteristica sia sottoutilizzata o sovrautilizzata. Un esempio di successo che il cliente desidera aggiungere è ottenere un trofeo per l'invio di 100 e-mail ai clienti (i clienti finali degli utenti SaaS) al mese, un altro per modificare le impostazioni dell'account dell'utente in un valore diverso da quello predefinito (ad esempio fuso orario, schema colori, eccetera). Non tutti i dati sui risultati possono essere determinati eseguendo query non in linea sul database perché molte operazioni aziendali avvengono senza toccare il DB, come l'invio di e-mail.
Nei giochi basati su motori come Source o Unreal, i risultati possono essere implementati utilizzando qualsiasi servizio di scripting in-engine disponibile e semplicemente agganciati a eventi di gioco preesistenti, disaccoppiando così il sistema dei successi dal codebase del motore o persino "game" / codice di codice mod. Ogni volta che uno script di successo rileva che alcuni risultati sono stati fatti, lo registra semplicemente localmente e / o spegne una richiesta di servizio web sul servizio per gli obiettivi di Steam / Xbox / etc.
Per ottenere qualcosa di simile in un'applicazione LoB, dovrei creare molti hook di eventi ovunque nell'applicazione (un compito enorme di per sé), e quindi creare un nuovo progetto per consumare quegli eventi e implementare la logica di realizzazione. Ma questo non risolve il problema dello storage dei dati - almeno con chiave / valore e JSON memorizza i dati arbitrari possono essere serializzati e collegati a qualsiasi oggetto esistente senza problemi, ma non possiamo farlo in SQL Server - un il nuovo db schema
dovrebbe esistere per contenere tabelle speciali che spesso contengono solo pezzi unici di dati - sembra molto dispendioso e inappropriato.
So che Visual Studio aveva un sistema di risultati per la versione 2012 ( link ) - ma hanno il vantaggio di poter archiviare i dati in modo arbitrario.