Nota : Sì, so che le funzioni di archiviazione nei database dovrebbero essere punite dalla legge.
Stiamo sviluppando un'applicazione web finanziaria che utilizza PostgreSQL, Sinatra e AngularJS. Come avrai intuito, un'applicazione finanziaria potrebbe aver bisogno di alcuni calcoli.
Esiste un certo modello di database (chiamato 'Hypothesis') che ha una certa funzione che deve essere eseguita durante la notte. Il problema è che questa funzione è diversa per ogni istanza del modello. Detto questo, ogni volta che viene aggiunta una nuova ipotesi, è necessario aggiungere anche una funzione corrispondente.
A causa della natura delle applicazioni finanziarie, la funzione può eseguire semplici operazioni aritmetiche o integrarsi su un'area. Questo ci lascia con le seguenti opzioni:
-
Implementa un DSL (lingua specifica per il dominio) : Questo sarebbe l'ideale, ma aggiungere la logica di ramificazione e di loop a un DSL sembra più come creare un nuovo linguaggio di programmazione.
-
pipe STDIO : consente semplicemente l'esecuzione di un programma in una sandbox su un server. Questo è più flessibile, ma gli dei della sicurezza del software non sarebbero misericordiosi. Docker Immagino?
-
Codice rubino puro sandboxed : crea una sandbox che consente di eseguire solo codice Ruby funzionalmente puro. Quindi valuta semplicemente la funzione all'interno della sandbox quando richiesto. Anche questo sarebbe un difetto di sicurezza, ma non la metà delle opzioni 2. Per ora questa opzione sembra essere implementabile usando trusted-sandbox e pure .
-
Usa la gemma di ottava-rubino : bella idea. Ma sembra che a nessuno importi molto del progetto e probabilmente avremo bisogno di biforcarlo e lavorarci sopra. Questa sembra l'opzione migliore, dal momento che scrivere espressioni matematiche complesse è banale in Octave.
-
???
-
L'utile
Un'altra preoccupazione sarebbe quella di implementare la capacità di testare le funzioni con dati falsi nel pannello di amministrazione, ma questo non è obbligatorio.
Qualcuno può suggerire un'opzione migliore / più flessibile / più sicura? O almeno uno che non memorizza una stringa di funzione nel database? Spero di aver spiegato abbastanza bene il problema.