[Application 58 ] « Scanne ton Employé » Notes à propos du Back End.

scanneIntroduction


Gérer un Back End Firebase noSql est totalement différent d’un back End Php Mysql ou Java Mysql.

Le point fort de Firebase est la synchronisation mondiale en temps réel et la simplicité apparente de la syntaxe

Le point faible est que l’on dépend d’un back end qui ne se trouve pas sur notre serveur.

 Le point fort de MYSQL ou de ORACLE et des bases relationelles est qu’il est bien plus facile de requeter la base avec SQL pour faire des statistiques numéraires ou graphiques, et qu’il est facile de récupérer un seul résultat avec un select, afin de réaliser le mapping objet/relationnel ensuite (Avec la fonction jsonEncode de php, par exemple).

Comment faire ?


Il faut partir de l’idée que notre modèle de données contient 100 000 objets, de cette manière, lors de la conception de l’app, on fait plus attention à comment gérer les appels à la BDD.

Avec AngularFire, se pose en effet un problème : il faut veiller, lorsque l’on change de vue, à ne pas constamment recharger tout notre modèle.

Il est possible :

  • De créer un objet synchronisé avec $firebaseObject(ref);
  • De créer un tableau d’objets synchronisé  avec $firebaseArray(ref);

Bien, sur, si notre tableau d’objets contient 100 000 personnes, on ne peut pas se permettre de le charger sur toutes les vues !

De plus il est possible de quérir la base de données, sans créer d’objets synchronisés.

Des problèmes à résoudre:


Sur l’application Scanne ton Employé:

  • Lors de l’appui sur la touche Edition, tout le modèle est rechargé ce qui n’est pas du tout normal, mais le problème est que pour modifier un objet, cela doit être un objet firebase et pas un objet javascript. La piste est de charger l’objet avec son id généré par firebase mais je n’ai pas réussi. (C’est très grave)

Pas d’intégrité référentielle


Lorsque l’on supprime une catégorie socio-professionelle ou des employés sont déjà inscrits, cela ne provoque pas d’erreur, l’employé conserve sa catégorie, qui est inscrit dans son objet JSON.

Par contre,si on re-crée la catégorie avec la même syntaxe, le programme retrouve la catégorie dans le menu déroulant lors de l’édition du profil, c’est vraiment impressionant.

Le crud Firebase organisé dans une factory :


J’ai créé (Un peu trop tard, j’aurais du le faire le premier jours tout de même(Souvent on ne le fait pas par paresse…) , une factory qui permet de gérer mes 2 modèles de données qui s’appellent employes et categEmployes sur Firebase.
Ce qui est assez tripant, c’est qu’on pourrait imaginer de transformer ces 2 factories en factories PHP-MYSQL ou JAVA-MYSQL, de ce fait, on pourrait migrer facilement l’application…


.constant('FIREBASE_URI','https://blinding-heat-xxxx.firebaseio.com/')

.factory('employesService', ['$firebaseArray', 'FIREBASE_URI', function ($firebaseArray, FIREBASE_URI) {
   
	var ref = new Firebase(FIREBASE_URI);
	var employes = $firebaseArray(ref.child('employes'));


	
    var getEmployes = function () {
        return employes;
    };
	
    var ajouterEmploye = function (employe) {
        employes.$add(employe);
    };

    var majEmploye = function (id) {
        employes.$save(id);
    };

    var supprimerEmploye = function (id) {
        employes.$remove(id);
    };
	
	return {
        getEmployes: 		getEmployes,
        ajouterEmploye: 	ajouterEmploye,
        majEmploye: 		majEmploye,
        supprimerEmploye: 	supprimerEmploye
	
    }
}])	 



.factory('categoriesService', ['$firebaseArray', 'FIREBASE_URI', function ($firebaseArray, FIREBASE_URI) {
   
	var ref = new Firebase(FIREBASE_URI);
	var categories = $firebaseArray(ref.child('categEmployes'));

	
    var getCategories = function () {
        return categories;
    };
	
    var ajouterCategorie = function (categorie) {
        categories.$add(categorie);
    };

    var majCategorie = function (id) {
        categories.$save(id);
    };

    var supprimerCategorie = function (id) {
        categories.$remove(id);
    };
	
	return {
        getCategories: 		getCategories,
        ajouterCategorie: 	ajouterCategorie,
        majCategorie:		majCategorie,
        supprimerCategorie: supprimerCategorie
	
    }
}])	 


Pour l’instant, je crée des statistiques en chargeant tout le modèles de données comme ceci :


/* CONTROLEUR DE LA VUE STATISTIQUES */
.controller('statsCtrl', function($scope,notifier,employesService,categoriesService) {	

	/* Chargement des modèles de données */
	var employes	= employesService.getEmployes();
	var categories 	= categoriesService.getCategories();

	/* Stats numériques */
	$scope.nbEmployes= function(){
		return employes.length;
	}
	
	/* Stats numériques */
	$scope.nbCategories= function(){
		return categories.length;
	}

/* FIN DU CONTROLEUR */
})


Le gros problème est que je ne voudrais bien sur pas télécharger tout le modèle de données pour créer mes stats dans la mesure ou il y a 100 000 employés ! En PHP MYSQL, c’est la norme et c’est très facile à faire avec les requêtes SQL et PHP ou JAVA, mais avec Firebase, c’est beaucoup plus compliqué de ne pas vouloir télécharger l’intégralité du modèle de données, il faut connaitre l’api Firebase.

En sql, il suffit de faire une requête count(*) dans le back end puis de transformer le résultat en JSON avec jsonEncode() de php.

Mon code Firebase pour les statistiques peut donc marcher comme ça pour l’instant, avec 1000 employés, mais pas plus ! Il faut donc essayer de mieux connaitre l’api firebase pour pouvoir réaliser des statistiques à partir de firebase, sans télécharger tout le modèle de données, qui est de 100 000 employés !

EDIT DU LENDEMAIN

Ca y est j’ai donc modifié le comportement du controleur de la vue MISE A JOUR d’un EMPLOYE, de ce fait, maintenant c’est l’objet JSON employé unique qui est chargé à partie de Firebase, ce n’est pas du tout couteux.

En fait, lorsque l’on clique sur editer dans la liste des employés, le $id qui identifie l’employé sur firebase est récupéré, puis stocké dans le service stockeIdFirebaseEmploye.

Ensuite, lorsque le controleur majCtrl est chargé avec la vue nouveau.html, je télécharge l’objet EMPLOYE en fonction du $id stocké dans le service stockeIdFirebaseEmploye. Du coup c’est méga rapide !

Voici le code qui télécharge l’objet JSON employé sur firebase :

$scope.nouvelEmploye =  $firebaseObject(ref.child('employes').child(employeFirebaseId));

Puis après, il faut mettre un callback, pour attendre que l’objet soit chargé avant d’opérer sur la vue :

/* FONCTION CALLBACK QUI ATTTENDS QUE L OBJET SOIT INTEGRALEMENT CHARGE */
	$scope.nouvelEmploye.$loaded().then(function(){
		$scope.generationCodeBarre	=""; /* Initialise le code Barre */
		$scope.nouvelEmploye.dateNaissance  = new Date($scope.nouvelEmploye.dateNaissance);
		$scope.nouvelEmploye.identifiant = '';
		if(!$scope.nouvelEmploye.fichiers){
			$scope.nouvelEmploye.fichiers = [];
		};
	}); 
Publicités