Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2270 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[SGBD] [semi-résolu] Comment organiser mes données de façon optimale ?

n°1954063
nlc
Le mieux est l'ennemi du bien
Posté le 30-12-2009 à 19:10:05  profilanswer
 

Reprise du message précédent :

anapajari a écrit :


Si c'est du 1-0,1 en théorie tu balourdes tout dans la même table avec les champs en question nullable.
 


Ok compris ! Mais ça m'embête, si un jour je dois intégrer un évènement lié à beaucoup de données ça me fera une pagaille de champ dans la table EVENTS  :sweat:  
 
 

anapajari a écrit :


L'argument "je sais ecrire la requête qui remonte l'info que je veux malgré une structure bancale" est difficilement recevable :o
La même requête avec "ma" structure donnerait:

Code :
  1. SELECT          
  2.          lpe.value
  3. FROM
  4.          evenement
  5.          INNER JOIN l_parametre_evenement lpe ON  lpe.evenement_id = evenement.id
  6.          INNER JOIN parametre ON parametre.id = lpe.parametre_id
  7. WHERE
  8.          parametre.code = 'XXX'
  9. ORDER BY
  10.          evenement.date DESC
  11. LIMIT 1


Sauf que les données appartiennent à qui elles devraient :)
La date est celle de l'evenement, le code celui du paramètre et la valeur celle qui relit les deux.
 


Ben vu de mon côté de programmeur C embarqué, ça n'est pas bancal  :ange:  
Car dans mon applicatif, quand j'ai besoin de récupérer la valeur d'un paramètre, il me semble plus logique de le récupérer dans une table de paramètre toute bête, plutôt que de faire une requête qui fait aussi référence à une table d'évènements.
La table d'évènement à mon sens n'étant qu'une "couche" plus haut niveau qui englobe le nom du paramètre modifié et sa nouvelle valeur, et rajoute un timestamp et un commentaire éditable.
Du point de vue "couche applicative", au niveau de la couche paramètres je n'ai pas besoin (et d'ailleurs on ne peut pas si le code est bien écrit) d'avoir ou récupérer des infos de la couche au dessus. Du coup j'ai tendance à structurer ma base avec le même type de raisonnement  ;)  
 
 

anapajari a écrit :


ouais mais non... pour moi ajouter un paramètre c'est :
- ajouter une entité paramètre (insert dans "parametre";)
- créer un evenement "initialisation du parametre" (insert dans evenement)
- lui affecter sa valeur initiale (insert dans lpe)
 


Oui j'ai bien compris  ;)  
Mais toujours depuis mon point de vue de soft embarqué, une table de parametre c'est un peu comme un fichier de config avec une liste de "parametre=valeur".
Si je veux mémoriser un nouveau parametre, je rajoute une ligne nouveauParametre=valeur.
Derrière l'applicatif lit le fichier, si le parametre qu'il cherche n'y est pas, j'initialise à la valeur par défaut et je rajoute la ligne à la fin du fichier "parametre=valeur par defaut".
Effectivement dans le cas d'un fichier il serait idiot à chaque modif de parametre de rajouter une ligne dans le fichier plutôt que de modifier la valeur sur la bonne ligne.
Mais dans mon cas ça à l'avantage de pouvoir faire un suivi des modifications ET de ne pas toucher la structure d'une quelconque table si je dois gérer un nouveau parametre, je rajoute juste un enregistrement avec le nom du nouveau parametre et sa valeur par défaut.
 

anapajari a écrit :


J'ai vu trop de systèmes qui au départ étaient "juste un petit truc, on va pas se compliquer la base" impossibles à maintenir/faire evoluer à cause de la structure de la bdd pour pas raler ...
A la question "comment organiser mes données de façon optimale" je réponds "pas comme tu es en train de le faire" mais l'essentiel c'est que tu arrives à faire ce que tu veux :D  
 


Je suis confronté au même problème en programmation embarqué, les clients sont spécialistes pour faire évoluer le cahier des charges au gré des avancements  :D  
Du coup il faut coder intelligemment.
Mais dans le développement dont il est question ici, c'est moi qui établit le cahier des charges  :sol:  
 
 

anapajari a écrit :


Sur un "petit projet web", la flemme de pas pouvoir faire href="lechampsdelabase" (et j'aime pas trop le binaire direct dans l'html)
Sur un "gros" projet, le fait que la base peut vite prendre des proportions dementielles (et pb sur backup/restore) + ne pas avoir la main sur le stockage des fichiers.


Ben là en l'occurence si je garde la photo dans un blob, dans mon tableau journal lorsqu'il y aura un évènement photo le code html généré sera :
<img src="image.php?id=XXX&mini=1> avec le id correspondant au numéro unique de la photo dans la table PHOTOS.
Le fichier image.php qui permet de renvoyer l'image au navigateur est déjà écrit ça c'était pas dur  :D  
 
Donc maintenant en considérant que je garde ces structures de tables :
 
Table PARAMETERS :
 


id        (clé primaire autoincrement)
name    (nom du parametre modifié)
value  (nouvelle valeur du paramètre)


 
Table PHOTOS :
 
 


id                (clé primaire autoincrement)
data            (blob de la photo)
data_mini  (blob de la miniature de la photo)


 
table EVENTS :
 
 


id                             (integer autoincrement, clé primaire)
date                         (timestamp, date et heure de la creation de l'enregistement)
lastModification (timestamp, date et heure de la dernière modification de cet enregistement)
code                         (integer, code d'evenement)
parameter_id         (integer, clé etrangère vers le parametre qui a été modifié)
photo_id                 (integer, clé etrangère vers la photo qui a été uploadée)
comment                   (text, commentaire éventuel associé à cet évènement)


 
 
Y a t-il un moyen en une seule requête de récupérer d'un seul coup les champs event.date, event.code, event.photo_id, parameters.name et parameters.value en filtrant sur "code" et plage de "date" ?
Vu que dans la génération de mon tableau "journal" je n'ai pas besoin du blob de l'image (photo_id suffit pour générer ma balise <img> ), le truc vicieux avec les jointures c'est juste pour récupérer parameters.name et parameters.value en fonction de event.parameter_id.

Message cité 1 fois
Message édité par nlc le 30-12-2009 à 19:20:32

---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
mood
Publicité
Posté le 30-12-2009 à 19:10:05  profilanswer
 

n°1954065
nlc
Le mieux est l'ennemi du bien
Posté le 30-12-2009 à 19:23:11  profilanswer
 

En attendant une réponse je vais essayer de la trouver tout seul en faisant joujou dans sqlitemyadmin !


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°1954072
nlc
Le mieux est l'ennemi du bien
Posté le 30-12-2009 à 20:18:09  profilanswer
 

Bon j'ai déjà ça qui marche :
 
SELECT events.date, events.code, events.photo_id, parameters.name, parameters.value
FROM events
LEFT OUTER JOIN parameters ON parameters.id = events.parameter_id
WHERE
events.code = 100


Message édité par nlc le 30-12-2009 à 20:18:29

---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°1954129
nlc
Le mieux est l'ennemi du bien
Posté le 31-12-2009 à 01:01:09  profilanswer
 

ca marche aussi avec :
 
SELECT events.date, events.code, events.photo_id, parameters.name, parameters.value
FROM events
INNER JOIN parameters ON parameters.id = events.parameter_id
WHERE
...
AND
...
 
C'est quoi la différence entre INNER JOIN et LEFT OUTER JOIN ?
Je crois qu'il va falloir que j'aille potasser le bouquin le SQL pour les nuls :D


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°1954163
anapajari
s/travail/glanding on hfr/gs;
Posté le 31-12-2009 à 10:17:39  profilanswer
 

nlc a écrit :

Ok compris ! Mais ça m'embête, si un jour je dois intégrer un évènement lié à beaucoup de données ça me fera une pagaille de champ dans la table EVENTS  :sweat:


c'est "amusant" ça t'embête pour ça mais pas pour les coups des paramètres :o
 

nlc a écrit :

Ben vu de mon côté de programmeur C embarqué, [...] Du coup j'ai tendance à structurer ma base avec le même type de raisonnement  ;)


Bin demande pas si c'est "bien organisé" et fait à ta sauce  :ange:  
Tout ce que je dis c'est que j'aurais pas fait comme ça!
 

nlc a écrit :

Mais dans mon cas ça à l'avantage de pouvoir faire un suivi des modifications ET de ne pas toucher la structure d'une quelconque table si je dois gérer un nouveau parametre, je rajoute juste un enregistrement avec le nom du nouveau parametre et sa valeur par défaut.


c'est pas parce que c'est plus simple (pour toi) à coder que c'est mieux. Et par ailleurs ça revient au même avec ce que je te proposais.
 

nlc a écrit :

Ben là en l'occurence si je garde la photo dans un blob, dans mon tableau journal lorsqu'il y aura un évènement photo le code html généré sera :
<img src="image.php?id=XXX&mini=1> avec le id correspondant au numéro unique de la photo dans la table PHOTOS.
Le fichier image.php qui permet de renvoyer l'image au navigateur est déjà écrit ça c'était pas dur  :D


Sauf que, admettons tu "affiches" 10 evts avec chacun une photo, que va-t-il se passer:
- demande au serveur pour la liste. 1 requête qui remonte dix lignes, pour chaque ligne tu créées donc un src="image.php?id=XXX&mini=1
- le navigateur interprète l'html et fait 10 demandes au serveur pour la page image.php
- chacune de ces demandes fait une nouvelle requête à la base pour remonter les blobs
Je pense que dans ton contexte tu t'en fous mais sinon je trouve pas ça super optimisé :o
 
 

nlc a écrit :

C'est quoi la différence entre INNER JOIN et LEFT OUTER JOIN ?
Je crois qu'il va falloir que j'aille potasser le bouquin le SQL pour les nuls :D


Je te renvoie au lien du topic de MB sur les jointures, c'est tout bien expliqué.


Message édité par anapajari le 31-12-2009 à 10:18:32

---------------
Software and cathedrals are much the same - first we build them, then we pray.
n°1954170
nlc
Le mieux est l'ennemi du bien
Posté le 31-12-2009 à 10:28:19  profilanswer
 

A vrai dire au début de la discussion je cherchais surtout comment organiser les données au niveau du serveur, qui va centraliser les données de tous les appareils.
Je ne savais pas trop s'il fallait que je crée des tables pour chaque appareil, ou que je crée des tables générales avec les enregistrements mélangés de tous les appareil, avec juste un champ permettant de déterminer à quel traitement appartient l'enregistrement.
 
Au niveau de la bdd locale de chaque appareil, je m'imaginais à peu près comment faire, sauf que je pensais construire mon tableau journal en re-requêtant à chaque ligne, mais maintenant ce n'est plus la peine et c'est très bien.
 
Tu as raison pour ta remarque au niveau des 10 evts avec photo, c'est vrai que pour la construction du tableau je n'aurai qu'une requête, mais après le navigateur fera 10 appels à image.php, faisant donc 10 requêtes à la bdd. Effectivement là c'est un avantage de stocker l'image dans le système de fichier.
 
Bon je vais avancer dans mon code php, les photos je vais faire ça en dernier donc je me laisse un temps de reflexion supplémentaire :)


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
n°1954235
MagicBuzz
Posté le 31-12-2009 à 14:07:25  profilanswer
 

D'un autre côté, entre un appel au système de fichier et un appel à la BDD (surtout si on tape dans la PK) je doute que les différences de performances soient si évidentes.
 
Ceci n'engage que moi.

n°1954240
nlc
Le mieux est l'ennemi du bien
Posté le 31-12-2009 à 14:12:45  profilanswer
 

ben disons que ça évite de faire tourner php et ça évite un accès bdd, le serveur web (lighttpd dans mon cas) envoie directement le fichier.
 
Mais bon dans mon cas vu que j'ai grand max un seul utilisateur connecté au boîtier en même temps, c'est sûr que ça va pas changer grand chose !


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[VBscript] comparaison de chaine/filtre(résolu)[C#] (RESOLU) GetSchemaTable trop de champs !
[RESOLU]Serialize de session/ IE ? :/[Résolu] Copier la structure d'un site
[Résolu] Lien non cliquable sous Firefox[résolu] création réseau ad-hoc
[PERL] Récupération ip/mac de dhcpd.leases [RESOLU]Pb avec XML en AS3 [Résolu]
[RESOLU] Modification multiple de champs SQL[Resolu] Requête SQL utra-looooongue...
Plus de sujets relatifs à : [SGBD] [semi-résolu] Comment organiser mes données de façon optimale ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR