Descrizione del modello di database mediante le costanti

7

Voglio creare una classe con costanti statiche che vengono utilizzate ogni volta che una parte di un'applicazione desidera accedere al database in qualsiasi modo. In questo modo voglio rimuovere tutti i numeri magici e stringhe all'interno del mio codice applicazione, tranne in un posto. Quindi in qualsiasi momento è necessario apportare modifiche al modello di database, tutte le regolazioni devono essere eseguite in un punto o il compilatore trova tutte le altre.

Comunque, questo è quello che ho finora

#include <QObject>

class DatabaseModel : public QObject
{
    Q_OBJECT
public:
    static const QChar SCHEMA_SEPARATOR() { return '.'; }

    static const QString qualifiedTableName(const QString &schema, const QString &table) {
        return schema + SCHEMA_SEPARATOR() + table;
    }

    static const QString SCHEMA_VERSION() { return "0.2"; }

    static const QString DATA_SCHEMA() { return "core"; }
    static const QString DEFAULT_SCHEMA() { return "public"; }
    static const QString LOG_SCHEMA() { return "audit"; }

    static const QString UNIT_TABLE() { return "unit"; }
    static const QStringList UNIT_TABLE_COLS() {
        return QStringList() << "id"
                             << "name"
                             << "abbreviation";
    }
};

Esempio di utilizzo

// get the fully qualified database table name
// result: core.unit
DatabaseModel::qualifiedTableName(DatabaseModel::DATA_SCHEMA(), DatabaseModel::UNIT_TABLE());

// get the database column name
// result: name
DatabaseModel::UNIT_TABLE_COLS().at(1);

Problemi risultanti dal mio punto di vista:

  • invocazione di funzione piuttosto lunga
  • separazione tra la tabella e le sue colonne

Ho provato alcune costellazioni di classe, ma anche il modo non è felice. Quindi la mia domanda : esiste un approccio semplice e piacevole per accedere ai nomi dei database e al qualificatore per un modello di database complesso?

Sto usando Qt (5.6), PostgreSQL con C ++ . Potrebbe essere possibile descrivere una soluzione in puro C ++ perché non ci dovrebbero essere vantaggi nell'utilizzo della funzionalità di Qt.

Modifica: Inoltre, utilizzo Qt's MVC per accedere al database, ovvero il suo QSqlTableModel .

    
posta maxik 23.12.2016 - 19:31
fonte

1 risposta

2

Se si tratta solo della lunghezza delle espressioni, potresti:

  • crea un oggetto locale DatabaseModel dbm;
  • o usa uno spazio dei nomi e un claus usando claus invece di una classe.

Tuttavia, questo finirebbe in una classe in costante crescita, senza una reale separazione delle preoccupazioni. E ti lascerà i problemi dei nomi delle tabelle e dei nomi delle colonne.

Pertanto ti suggerisco di utilizzare il schema dei dati del gateway modello:

  • potresti raggruppare le costanti indipendenti dalla tabella in una classe genitore DataGateway , insieme ad alcune comuni funzioni di accesso / gestione della tabella.
  • Si ricaverebbe un TableXGateway concreto per ogni tabella X . Ciò consentirebbe di mantenere non solo il nome della tabella e i nomi delle colonne insieme, ma anche alcune logiche aggiuntive della tabella (query).

Idealmente, tutto il tuo codice SQL sarebbe concentrato in queste classi (e forse in alcuni oggetti di query ) quindi che il resto del codice diventerebbe meno dipendente dal database.

    
risposta data 02.01.2017 - 03:50
fonte

Leggi altre domande sui tag