Modello dati per query persistenti nel database

2

Mi è stato chiesto di creare ciò che è essenzialmente un generatore di query per un'applicazione di reporting.

La varietà di oggetti da interrogare, i potenziali modificatori, il numero di condizioni e così via da segnalare mi hanno portato a concludere che un generatore di query sarebbe il modo migliore per svolgere questa attività.

Sto cercando di decidere il modello di dati per supportare la memorizzazione dei parametri di query.

Ho visto i modelli in questa domanda SO così come in questo tutorial . Ma dal momento che è particolarmente importante scegliere un buon modello in anticipo, apprezzerei davvero qualsiasi input.

EDIT: ecco alcuni dati sulla tecnologia e i requisiti

  • Sto lavorando con C # e .NET Framework 4.5 (usando ASP.NET MVC per la presentazione)
  • Sto utilizzando Oracle Database 10g
  • Ho Dapper e LinqToDB per Oracle disponibili per l'accesso ai dati

Vorrei progettare uno schema che possa contenere quanto segue:

  • Consente di memorizzare le query in termini di parti costitutive, in cui determinate parti (come vincoli / predicati) possono essere codificate come snippet SQL o SQL effettivi nel caso di una logica particolarmente complessa da incapsulare
  • Consente di formare i vincoli in un formato "gruppo", "vincolo", in cui una query ha un singolo gruppo radice, ciascun gruppo è dotato di AND / OR, i vincoli appartengono ai gruppi ei gruppi possono avere sottogruppi
  • Riduce al minimo la necessità di definire esplicitamente i join come parte della query (in modo che possano essere desunti dai soggetti dei vincoli o minimizzati se necessario)
  • Può memorizzare l'editor appropriato e l'origine dei valori dell'editor, se appropriato per un determinato campo
posta tacos_tacos_tacos 13.09.2014 - 10:36
fonte

1 risposta

1

La maggiore complessità per i creatori di query deriva dal tentativo di gestire l'ambito di AND s un OR s. Se riesci a gestirli con eleganza, il tuo modello può essere più semplice. Raccomando di avere due tipi di predicati:

  • Il tuo predicato vaniglia: value1 operator value2 .

  • I tuoi composti predicati (o ciò che potremmo chiamare "parentesi implicite"). L'intero composto viene taggato come utilizzando AND o OR logic. Questo lo riduce a un semplice elenco di predicati (numero illimitato) più un singolo tag logico binario.

Questi due predicati offrono un'interfaccia polimorfica (ad esempio IEvaluate ). Il primo viene valutato normalmente e restituisce un valore booleano. Quest'ultimo è ridotto (ad es. Tu fold sull'elenco) anche a un valore booleano. Questo sarebbe ricorsivo dal momento che potremmo avere composti annidati.

Usando questo modello, al più alto livello avrai un singolo predicato o un singolo predicato composto. Naturalmente, il predicato composto può annidare a qualsiasi profondità. Questo è ciò che il tuo esempio Knockout.js già illustra.

Eliminando l'opzione di costruire un predicato composto che colloca qualsiasi combinazione di AND se OR s tra i vari predicati, semplifichi un po 'le cose e non perdi nulla. Sei in grado di esprimere qualsiasi criterio sia necessario. Questo eliminerà completamente il tuo concetto di Lefts e Rights che penso sia una buona cosa.

    
risposta data 15.09.2014 - 17:38
fonte