8797 sujets

Développement web côté serveur, CMS

Bonjour, je viens de réaliser quelque chose et je me demande si c'était finalement la bonne solution. Pour simplifier voici la structure de ma table.

elements: id,name,cat1_ID,cat2_ID
cat1: id,name
cat2: id,name

sur ma page admin j'ai trois forulaires:

ajout cat1: simple champ texte
ajout cat2: idem
ajout elements: name(champ texte) cat1(liste deroulante 1 seul choix possible), cat2(checkbox plusieurs choix possibles)

vous l'aurez compris, les champs 'cat1' et 'cat2' sont générés dynamiquement depuis la BDD.

Alors, ce que j'ai fait pour le champ 'cat2' qui peut contenir plusieurs ID (mais pas obligatoirement), c'est un serialize() sur mon $_POST['cat2'] que j'inclus tel quel dans la BDD.

Revenons maintenant au site, j'ai deux menus:

Un qui m'affiche les catégories 'cat1' l'autre les 'cat2' pas de soucis pour ça.

Maintenant lorsqu'on clique sur un item du menu, ça m'affiche les éléments qui sont dans ces catégories.

Pour 'cat1' pas de soucis, un simple SELECT + WHERE et c'est réglé.

Mais pour 'cat2' ? Comment faire ? Puisque le champ 'cat2_ID' de ma table 'elements' contient le résultat d'un serialize() ??

J'ai pensé au LIKE tout simplement, ça fonctionnerai, mais plus j'avance et plus je me dis que je n'ai pas fais ça de la bonne manière.

J'aurai besoin de votre avis.

Merci.

EDIT: Je viens de découvrir le type SET pour l'enregistrement de plusieurs valeurs dans la base de données. C'est tout ce qu'il me faut. Je passe ce sujet en résolu.

Edit2: Bon bah les valeurs d'un champ de type SET doivent apparemment être définies lors de la création du champ. Donc ce n'est pas ce qu'il me faut. Retour a la case départ. Je pense que je vais rester sur mon serialize()
Modifié par Zahn (07 Oct 2011 - 14:15)
salut,

de mémoire il y a un type de colonne permettant de stocker une sorte de tableau (row) mais je ne me souvient plus du nom Smiley ohwell

De ce que je vois tu a un problème de modélisation de ta base.
je ne connais pas la différence entre cat1 et cat2, donc je suppose qu'ils s'agit de catégorie sans corrélation (vu qu'il n'y a pas de référence à l'autre table dans chacune de table catégorie) c'est pourquoi, je pense, il ne devrait y avoir qu'une seule table catégorie et une table qui fait la jointure entre catégorie et elements.

exemple
create table elements (
idelement entier clef primaire
nom varchar
description varchar
etc etc
)

create table categories (
idcategorie entier clef primaire
nom varchar
)

create table categorieElements (
id entier clef primaire
idelement entier : clef étrangère de la table elements (idelement)
idcategorie entier : clef étrangère de la table categories (idcategorie)
)

avec ça tu peux simplement gérer les catégorie d'un élément, de plus tu lève le problème sur le nombre de catégorie.

si tu veux gérer une arborescence des catégorie il faut ajouter, sans la table categories, une champ categorie_parent qui contiendra l'id de la catégorie parentes (il s'agit l'a d'une auto jointure).

j'espère que c'est pas trop confus sinon demande Smiley biggrin

@+
Salut et merci pour ton explication, j'ai a peu près tout compris.

Tu me suggère donc de créer une table spécifique avec un enregistrement pour chaque catégorie inscrite pour un élément. Donc si un élément est inscrit dans 3 catégorie, il y'a donc 3 enregistrement dans cette table pour cet élément. C'est bien ca ?

Dans ce cas, ta remarque est pertinente.

a écrit :
De ce que je vois tu a un problème de modélisation de ta base.
je ne connais pas la différence entre cat1 et cat2, donc je suppose qu'ils s'agit de catégorie sans corrélation (vu qu'il n'y a pas de référence à l'autre table dans chacune de table catégorie) c'est pourquoi, je pense, il ne devrait y avoir qu'une seule table catégorie et une table qui fait la jointure entre catégorie et elements.


En fait tu peux comparer cat1 et cat2 comme les catégories et les tags sur un blog, sauf que mes éléments ne peuvent s'inscrire que dans une catégorie, mais plusieurs tags sont possibles pour un élément. c'est pour cela que j'avais fais deux tables. Et surtout pour bien séparer ces valeurs dans la navigation du site. Un clic sur un tag ne renvoie pas la même chose que sur une catégorie.

Mais ça ne m’empêche pas de faire comme tu le suggère pour ma table cat2. donc créer une table intermédiaire qui va me servir de liaison.

J'espère avoir bien compris. Je vais avancer dans ce sens.

Merci.
Salut,

pas le choix avec MySQL (ou n'importe quel autre SGBD...) pour gérer les relations de types n:m (un élément peut être assigné à plusieurs catégories et à une catégorie peuvent être assignés plusieurs éléments) tu dois en passer par des tables de correspondances.

Je te suggère un peu de lecture : par exemple ce lien trouvé après une brève recherches google sur les types de relations en SQL

Petit guide d'analyse des données à l'aide de la méthode MERISE

Il existe d'autres méthodes pour représenter les données mais pour ce qui est du stockage en base de données Merise est plus appropriée.

EDIT:C'est pas non plus la peine d'essayer de comprendre tout Merise, mais les types de relation c'est importants à assimiler, ça évite de s'embourber dans ce genre de pièges (serialize par exemple...)
Modifié par skywalk3r (12 Oct 2011 - 10:16)