Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 12-08-2016 16:58:41

epcgroupe
Membre
Date d'inscription: 18-01-2016
Messages: 44

[zf2][News] Un modèle de table pour X table

Bonjour,

Je cherche une solution sur [zf2] pour le problème suivant :

J'ai une table QCP_CRPC, qui est la table de l'année en cours (cette année : 2016).
J'ai ensuite une autre table qui est de l'année 2015 : QCP_CRPC_2015.
L'année prochaine (2017), QCP_CRPC contiendra les données de 2017.
Les données de QCP_CRPC de 2016 seront stockées dans QCP_CRPC_2016.
Et ainsi de suite.
Soit dynamiques des tables font se créer chaque année sous le format "QCP_CRPC_XXXX" ou XXXX est l'année précédente.

Mon problème est le suivant :
Dans ZF2 on déclare un modèle QCPCRPC et QCPCRPCTable dans Model.
Puis on le rattache à une fonction dans le Controllers du type :

Code:

[lang=php]
public function getQCPCRPCTable()
{
    if (!$this->QCPCRPCTable) 
    {
    $sm = $this->getServiceLocator();
    $this->QCPCRPCTable = $sm->get('Front\Model\QCPCRPCTable');
    }     
    return $this->QCPCRPCTable;
}

Et enfin dans le fichier module.php on injecte les appels :

Code:

[lang=php]
'Front\Model\QCPCRPCTable' =>  function($sm)
{
    $tableGateway = $sm->get('QCPCRPCTableGateway');
    $table = new QCPCRPCTable($tableGateway);
    return $table;
},
'QCPCRPCTableGateway' => function ($sm) 
{
    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');                    
    $resultSetPrototype = new ResultSet();
    $resultSetPrototype->setArrayObjectPrototype(new QCPCRPC());
    return new TableGateway('QPC_CRPC', $dbAdapter, null, $resultSetPrototype);
},

Je souhaite éviter de créer X fois le modèle QCP_CRPC vu que la structure est la même que ceux QCP_CRPC_XXXX.
Et QCP_CRPC_XXXX arrive chaque année donc évité de rentrée dans le code tous les ans pour rajouter un bout de code.

Est qu'il y a un moyen de donner le nom de la table sur laquelle on souhaite de travaille, en sortant des sentiers battus ?
Tous en restant sous le format suivant :

Code:

[lang=php]
public function getAudit($audit_id)
{
    $audit_id  = (int) $audit_id;
    $rowset = $this->tableGateway->select(array('audit_id' => $audit_id));
    $row = $rowset->current();
    if (!$row) {
        throw new \Exception("Could not find row $audit_id");
    }
    return $row;
}

Merci d'avance de vos conseils ou idées.

Dernière modification par epcgroupe (12-08-2016 17:06:02)

Hors ligne

 

#2 16-08-2016 16:37:37

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 418

Re: [zf2][News] Un modèle de table pour X table

Après avoir lu et relu ton post, je me suis enfin décidé a rédiger un avis.

Personnellement un script qui automatise la création de table, même a des moment précis du temps, me dérange. C'est dégueulasse, pas fonctionnel, fouilli et contre intuitif en rapport avec des requêtes de suivi, business intelligence etc... Ce principe ne remplace pas un champ date dans ta table dans lequel tu pourrait filtrer chaque insert par année désirée.

Tu pourrai même te faire un script ZF2 qui le 31 décembre de l'année est appelé pour historiser ta table dans une table "archive" et ta table de travail pour l'année n'aurait pas la notion d'année si ce n'est une colonne date.

Après je ne connais pas ton projet, je ne sais pas qu'elle utilité tu as de cette table nommée de cette manière. Mais utiliser une BDD comme cela c'est renier la puissance de SQL avec des requête sur des dates.

Surtout pour des tables qui ont la même structure, le même type de données etc...


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#3 16-08-2016 17:40:59

epcgroupe
Membre
Date d'inscription: 18-01-2016
Messages: 44

Re: [zf2][News] Un modèle de table pour X table

Je suis d'accord sur le principe et sur la théorie, le seul problème est que cette table est un monstre au niveau volumétrie de data. Au bout de 1 ans et demie réel, elle fait dans les 20 millions de lignes.

Si on laisse sur une seul table, rien que la volumétrie auras des conséquence sur la performance des recherches de la données, même bien indexé. Hors les données doit être gardé 10 ans. Et que la table est exponentielle.

Hors ligne

 

#4 16-08-2016 20:31:57

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 418

Re: [zf2][News] Un modèle de table pour X table

Quel SGBD  as tu ? Oracle DB ? Postgre SQL ? MySQL ? Autre chose ?


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#5 17-08-2016 10:22:51

epcgroupe
Membre
Date d'inscription: 18-01-2016
Messages: 44

Re: [zf2][News] Un modèle de table pour X table

Le SGBD est MySQL. Personnellement, j'aurais pris un autre SGBD, ce n'est malheureusement pas moi qui l'ai définie..

Hors ligne

 

#6 17-08-2016 11:58:53

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 418

Re: [zf2][News] Un modèle de table pour X table

Donc si c'est exponentiel, tu as selon moi ta réponse, ton SGBD ne pourras pas survivre à des 400 Millions de ligne par an (ou plus, au bout de 5 ans on en sera ou ?), en tous cas il réussira moins bien qu'un autre SGBD, Postgre serait déjà plus adapté a ce genre de 'big' data.

Admettons que ta table faisant 20 Go possède environ 130 000 000 d'enregistrement, tu est déjà sur environ 4 enregistrements par seconde en moyenne sur un an  de manière continue.

Voici des liens que j'ai pu trouver :
http://blog.developpez.com/sqlpro/p9136 … e_aux_yeux

Je ne crache pas sur MySQL, je l'utilise moi même. Mais je pense que cerner ses limites est une nécessité. Et dans ton cas se réinterroger dessus me semble être une priorité. Bien sur je ne connais pas ton projet, une nouvelle fois, et je ne sais pas qu'elle est ton pouvoir de décision.


En rapport avec ce post : http://www.developpez.net/forums/d10651 … s-donnees/

Si un jour on te demande une extraction de données (le principe de base des données stockées) avec un group By sur cette table ou que sais-je encore, tu peux prendre un lit de camp tu vas y passer des heures sur la requête surtout que MySQL copie, lors d'un group by, dans des tables temporaires etc... et certainement qu'avec des jointure ce sera festival.

Alors MySQL c'est bien, mais c'est vraiment a prendre avec des pincettes quand on manipule ce genre de table.

Après je n'ai pas l'expérience pour juger qu'elle serait la meilleure solution a ton problème, une solution serait de créer un objet dont le seul but serait de créer ta table SQL en jouant sur la date en cours

Code:

[lang=php]
$date = new Datetime('today');
$name = 'QCP_CRPC_' . $date->format('Y');

// tu testes si cette table existe dans ta base
// Si elle existe pas tu la crée
// Et ensuite tu bosses dessus

Pour optimiser tu peux créer la table en fin d'année via tâche cron. Ton code a juste besoin de récupérer la table de l'année en cours.


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#7 17-08-2016 14:00:31

epcgroupe
Membre
Date d'inscription: 18-01-2016
Messages: 44

Re: [zf2][News] Un modèle de table pour X table

Il n'y aura pas d'extraction de données, vue que je fait un site qui va lire les datas et afficher les données.

Ce n'est pas la création qui me pose problème vu que je l'ai déjà fait en PHP.

C'est l'intégration du model de données de la base dans Zend...

Mon problème est le suivant :
Dans ZF2 on déclare un modèle QCPCRPC et QCPCRPCTable dans Model.
Puis on le rattache à une fonction dans le Controllers du type :

Code:

[lang=php]

?
public function getQCPCRPCTable()
{
    if (!$this->QCPCRPCTable) 
    {
    $sm = $this->getServiceLocator();
    $this->QCPCRPCTable = $sm->get('Front\Model\QCPCRPCTable');
    }     
    return $this->QCPCRPCTable;
}

Et enfin dans le fichier module.php on injecte les appels :

Code:

[lang=php]
'Front\Model\QCPCRPCTable' =>  function($sm)
{
    $tableGateway = $sm->get('QCPCRPCTableGateway');
    $table = new QCPCRPCTable($tableGateway);
    return $table;
},
'QCPCRPCTableGateway' => function ($sm) 
{
    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');                    
    $resultSetPrototype = new ResultSet();
    $resultSetPrototype->setArrayObjectPrototype(new QCPCRPC());
    return new TableGateway('QPC_CRPC', $dbAdapter, null, $resultSetPrototype);
},

Je souhaite éviter de créer X fois le modèle QCP_CRPC vu que la structure est la même que ceux QCP_CRPC_XXXX.
Et QCP_CRPC_XXXX arrive chaque année donc évité de rentrée dans le code tous les ans pour rajouter un bout de code.

Est qu'il y a un moyen de donner le nom de la table sur laquelle on souhaite de travaille, en sortant des sentiers battus ?
Tous en restant sous le format suivant :

Code:

[lang=php]
public function getAudit($audit_id)
{
    $audit_id  = (int) $audit_id;
    $rowset = $this->tableGateway->select(array('audit_id' => $audit_id));
    $row = $rowset->current();
    if (!$row) {
        throw new \Exception("Could not find row $audit_id");
    }
    return $row;
}

Merci d'avance de vos conseils ou idées.

Dernière modification par epcgroupe (17-08-2016 14:02:02)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages