Aller au contenu

construction d'une base de donnée complexe


Sujets conseillés

Posté

Bonjour,

J'ai besoin de votre aide pour construire l'architecture d'une base de donnée assez complexe. Je m'explique:

On demande a un utilisateur de choisir une carte parmi une liste prédéfinie. Un certain nombre de paramètres sont associés à chaque cartes. Pour chaque paramètres, on demande à l'utilisateur de choisir parmi des valeurs prédéfinies.

Jusqu'ici, tout va bien. Je créer :

-une table carte, dans laquelle je liste les différentes cartes

-une table paramètres dans laquelle je liste les différents parametres

-une table de jointure carte-parametre qui relie l'id d'une carte avec l'id d'un paramètre.

-une table valeur qui liste les différentes valeurs existantes

-une table de jointure parametre-valeur, qui relie l'id d'un parametre avec l'id d'une valeur.

La ou ca se complique, c'est que certaines combinaisons des valeurs renseignées entrainent de nouveaux paramètres, pour lesquels il faut à nouveau renseigner des valeurs qui peuvent à nouveau entrainer des paramètres...

Je joint un fichier exel avec le shéma d'un exemple, et le modele de base de donnée (incomplet) avec les valeurs utilisées dans l'exemple remplies. Cela facilitera certainement la compréhension de mon problème.

Vous trouverez le fichier exel ici:

http://julien.lutel.free.fr/sql/bdd.xls

Enfin, en fonction de toutes les différentes valeurs recueillies, on devra afficher la liste des competences maitrisées.

Je créerai sans doute une table compétence qui listera toutes les compétences possibles, et une table qui associera l'id d'une alarme avec l'id d'un parametre et d'une carte. Mais c'est un autre problème, chaque chose en son temps, je voudrais d'abord réussir à construire le reste de l'architecture de la table.

Je me doute que vous n'avez pas que ca à faire, mais si certains d'entre vous sont en vacances et s'ennuient (...) voyez ca comme un challenge !

Je remercie d'avance les âmes charitables qui accepteront de m'aider, et je retourne ma casser la tête...

Posté

Hello,

Je n'ai peut-être pas tout saisi, mais si une valeur est rattachée à un unique paramètre, pourquoi avoir une "table de jointure" paramètre-valeur ? Pourquoi pas une simple clé étrangère dans la table valeur ?

Posté

Je n'attends pas que l'on me construise ma base, mais qu'on me donne quelques indications sur l'architecture que je devrais employer pour pouvoir modéliser une structure selon l'exemple du fichier exel.

C'est vrai que la table de jointure paramètre-valeur est inutile ici, bien vu, je corrige. Et UNE table de gagné :)

Posté

Sur la structure, je vais pas m'étendre dessus, j'imagine que tu sais ce que tu veux, et ton truc a l'air à peu près cohérent (sans m'y être attardé).

La ou ca se complique, c'est que certaines combinaisons des valeurs renseignées entrainent de nouveaux paramètres, pour lesquels il faut à nouveau renseigner des valeurs qui peuvent à nouveau entrainer des paramètres...

Utilise un trigger, ça t'épargnera pas mal de code, et ça assainira ta base.

je voudrais d'abord réussir à construire le reste de l'architecture de la table.

J'espère que tu ne compte pas corriger le tir par la suite ?

Posté

Je suis sous mysql 4, et je ne peux pas upgrader, car je travaille pour une entreprise. Est-il possible d'utiliser des triggers avec une version mysql antérieure à la 5?

Posté (modifié)

J'espère pour toi que oui, je n'en suis pas persuadé, crée en un et vois le résultat :)

Message subliminal : convainc ton entreprise de migrer sous mysql5 ou postgre

Modifié par SStephane
Posté

Ca ne dépend pas que de moi. Je fait partie d'un petit service dans une entreprise multinationale, ils comptent migrer en janvier. Mais je ne ferais plus partie de l'entreprise à ce moment la...

Posté

Bonjour,

j'ai une nouvelle question, peut être un peu plus précise cette fois.

Je vous indique le contexte:

table Combinaison

numéro id_val id_carte

1 1 3

1 2 3

1 3 3

2 1 3

2 2 3

2 4 3

2 5 3

(apaprament, certains espaces sont effacés lorsque je poste le message. Donc pour chaque ligne, le premier chiffre correspond au champ numero, le 2eme au champ id_val , et le 3eme au champ id_carte)

On envoi i fois id_val par POST, et un id_carte.

On connait le nombre i.

On sait donc combien de reponses la requete devra récupérer. (i, pas une de plus ni une de moins)

Quelle requete sql ecrire?

La requete sera différente selon le nombre de valeurs envoyées par POST. Donc:

$i=2;

$req = $_POST['valeur1']

While ( isset($_POST['valeur.$i']))

{

$req = "( $req . ' OR ' . $_POST['valeur.$i']) )";

$i ++;

}

Donc la requête est:

"SELECT numéro from combinaison where id_carte= $_POST['carte'] AND $req;"

Prenons un exemple. Imaginons que j'ai envoyé par POST les valeurs qui ont pour id 1,2 et 3. (id_val=1, 2 ou 3) et l'id de la carte 3.

La requete me renvoie 3 fois le numéro 1, et 2 fois le numéro 2.

Je sais que je cherche une combinaison de $i résultats. Ici, on a $i=3.

Je veux donc récupérer le numéro 1 (car la requête renvoi $i fois le numéro 1, et ne pas prendre en compte le numéro 2, qui n'est renvoyé que 2 fois par la requête.

Ma question :

Comment puis-je faire cela? Il faut faire une nouvelle requete? Ou il suffit de rajouter un paramètre à ma requete précédente?

Merci encore une fois de votre aide :)

Posté

Salut,

Là comme ça, et sans tout voir, je pense qu'il te faudrait utiliser dans ta requête :

1/ Une clause GROUP BY pour regrouper les résultats par numéro (GROUP BY numero)

2/ Un compteur du nombre de résultats pour chaque numéro (SELECT COUNT(*) AS quantite)

3/ Faire un tri par quantité décroissante (ORDER BY quantite DESC)

4/ Prendre le premier résultat (LIMIT 0,1)

Un truc style :

SELECT numero, COUNT(*) AS quantite FROM combinaison WHERE valeur=2 OR valeur=1 OR valeur=3 GROUP BY numero ORDER BY quantite DESC LIMIT 0,1

Sinon, fais attention aux injections SQL, il ne faut jamais manipuler des données de formulaire comme ça directement dans la base.

Posté

Merci Ernestine.

Je crois que tu as bien cerné mon problème.Le group by est intéressant.

Par contre, je ne pense pas pouvoir utiliser le order by, car il ne faut pas que le nombre de numéros soit inférieur à $i, mais pas supérieur non plus.

SELECT numero, COUNT(*) AS quantite FROM combinaison WHERE valeur=2 OR valeur=1 OR valeur=3 GROUP BY numero AND where quantite= $i;

Est ce que cette syntaxe est correcte?

Je vais faire un petit tour sur la toile pour voir la syntaxe de GROUP BY.

Sinon, tu me dis : " fais attention aux injections SQL, il ne faut jamais manipuler des données de formulaire comme ça directement dans la base. "

Je pense que tu fais allusion à

$i=2;

$req = $_POST['valeur1']

While ( isset($_POST['valeur.$i']))

{

$req = "( $req . ' OR ' . $_POST['valeur.$i']) )";

$i ++;

}

Je ne vois pas comment faire pour générer la requête autrement. Le nombre de paramètre varie.

Posté (modifié)

Ah ben non, si tu veux sélectionner ceux qui n'ont que deux résultats il faut ajouter une clause HAVING :

SELECT numero, COUNT(*) AS quantite FROM combinaison WHERE valeur=2 OR valeur=1 OR valeur=3 GROUP BY numero HAVING quantite=2

Pour les injections sql, il faut échapper les données de formulaire, sinon tu n'es pas à l'abri qu'un pirate poste le formulaire avec des données contenant elles-mêmes des requêtes lui permettant de s'introduire dans la base.

Pour cela, il faut entrer les données de formulaire avec la fonction : http://fr.php.net/mysql_real_escape_string

Voir aussi si sur ton serveur, les magic_quotes_gpc sont sur ON ou sur OFF.

Modifié par Ernestine
Posté

Ah d'accord, je vois mieux ce que tu veux dire.

En fait, tout mes formulaires sont des select, donc l'utilisateur ne peut pas rentrer ce qu'il veut.

Il est quand même conseillé de sécuriser les variables POST?

Posté

L'utilisateur peut toujours rentrer tout ce qu'il veut, d'ailleurs rien ne l'oblige à poster le formulaire en passant par ton site.

Il faut absolument sécuriser les données de formulaire, quelle que soit la requête, select ou autre.

Posté
En fait, tout mes formulaires sont des select, donc l'utilisateur ne peut pas rentrer ce qu'il veut.
installe cet addon de firefox http://tamperdata.mozdev.org/help.html et tu verras qu'on peut modifier comme on veut des envois de formulaires en GET ou POST et là, c'est la version gentille.

L'autre version se passera directement via un autre serveur, sans même passer par ton site avec l'envoi du POST

Il faut donc bien vérifier toutes les données renvoyées par (soit-disant) un formulaire, et ce, sur le serveur, pas juste en js

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...