Descripción del modelo de base de datos usando constantes

7

Quiero crear una clase con constantes estáticas que se utilizan cuando una parte de una aplicación quiere acceder a la base de datos de alguna manera. De esta manera, quiero eliminar todos los números y cadenas mágicas dentro del código de mi aplicación, excepto en un lugar. Entonces, en cualquier momento posterior, cualquier cambio en el modelo de la base de datos debe realizarse, todos los ajustes deben realizarse en un lugar o el compilador encuentra todos los demás.

De todos modos, esto es lo que tengo hasta ahora

#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";
    }
};

Uso de muestra

// 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);

Problemas resultantes desde mis puntos de vista:

  • invocación de función bastante larga
  • separación entre la tabla y sus columnas

Probé alguna constelación de clase pero tampoco muy feliz. Entonces, mi pregunta : ¿Existe un enfoque simple y agradable para acceder a los nombres de las bases de datos y al calificador para un modelo de base de datos complejo?

Estoy usando Qt (5.6), PostgreSQL con C ++ . Podría ser posible describir una solución en C ++ puro porque no debería haber ventajas en el uso de la funcionalidad de Qt.

Editar: Además, uso MVC de Qt para accediendo a la base de datos, es decir, su QSqlTableModel .

    
pregunta maxik 23.12.2016 - 19:31

1 respuesta

2

Si solo se trata de la longitud de las expresiones, podrías:

  • crear un objeto local DatabaseModel dbm;
  • o usa un espacio de nombres y un claus usando en lugar de una clase.

Sin embargo, esto terminaría en una clase en constante crecimiento, sin una separación real de preocupación. Y te dejará los problemas de nombres de tablas y nombres de columnas.

Por lo tanto, le sugiero que utilice el pasarela de datos de tabla :

  • podría agrupar las constantes independientes de la tabla en una clase primaria DataGateway , junto con algunas funciones comunes de acceso / administración de tablas.
  • Derivaría un TableXGateway concreto para cada tabla X . Esto permitiría mantener no solo el nombre de la tabla y los nombres de las columnas, sino también alguna lógica adicional específica de la tabla (consultas).

Idealmente, todo su código SQL se concentraría en estas clases (y tal vez en algunos objetos de consulta ) para que que el resto de tu código se volvería menos dependiente de la base de datos.

    
respondido por el Christophe 02.01.2017 - 03:50

Lea otras preguntas en las etiquetas