Aller au contenu

Gestion d'options multiples


Spidetra

Sujets conseillés

Salut le Hub,

Désolé pour la longueur du post.

J'ai besoin de gérer des options multiples pour une gamme de produits.

Pour simplifier et optimiser les requêtes, j'ai décidé d'utiliser des techniques de bit bashing

http://www.webmaster-hub.com/publication/article75.html

Je dois gérer ces options :

- dans le stockage de mes données en SQL

- Dans les traitements en PHP

- En javascript : gestion des cases à cocher.

J'ai une connaissance théorique de ces techniques. Mais j'avoue ne pas être très à l'aise avec les opérateurs binaires.

Le Problème :

Je doit gérer de [1..n] options contenant chacune de [2..m] possibilités.

Je ne connais pas les valeurs max de n et de m.

Les possibilités pour une option donnés sont mutuellement exclusive.

Même si en début de projet je vais essayer d'être le plus exhaustif possible sur les différentes options, je veux pouvoir ajouter de nouvelles options ou de nouveaux choix sans problème.

Je ne veux pas gérer ces options avec des requêtes SQL complexe, et une ribambelle de AND ou de OR. D'où le choix du bit bashing.

Exemple avec 3 options :

Option 1 :

=> Choix A, B, C, D, E, F

Option 2 :

=> choix A, B

Option 3 :

=> A, B, C, D

Je pourrais avoir les produits :

Produit 1 : 1A & 2A & 3A

Produit 2 : 1D & 2A & 3C

Produit 3 : 1A & 2A & 3D

etc....

Mon problème va se situer :

1. Au niveau du stockage dans la base SQL

2. Au niveau de la sélection.

La Solution :

Format du champ de stockage :BIGINT unsigned ( 64-bits ).

Cela va me laisser 64 possiblités d'option ce qui devrait être suffisant ( j'espère ! ).

Première approximation, sans forcer, une trentaine d'options

Concrètement :

1. Comment je stocke mes valeurs d'option dans la base ? Est-ce que je suis obligé de les saisir en base 10 ou est-ce qu'il est possible de les saisir dans une autre base ( base Hexa ) ?

En base 10, si je dépasse les 30 options, la saisie est sujette a erreur.

2. Pour stocker la valeur d'un produit :

C'est le plus simple. Je pense qu'en faisant un & binaire entre les options c'est bon.

3. La sélection des produits

La sélection des produits va dépendre de cases à cocher gérer par l'utilisateur final.

J'ai envie ( en javascript ) de stocker la résultante des choix de l'utilisateur dans une seule variable.

Mon problème c'est que je doit stocker des & et des | dans cette variable :

Ex : Si l'utilisateur a coché toutes les cases possibles. Sauf erreur de ma part :

( 1A | 1B | 1C....etc ) & ( 2A | 2B ) & ( 3A | 3B | 3C | 3D )

Le plus simple serait d'avoir une seule variable que je pourrais modifier sur chaque action de check, uncheck. Est-ce que c'est possible en utilisant les opérateurs sur les bits ?

Est-ce qu'il serait préférable de gérer une variable par option ?

Ouf !....

Merci à tout ceux qui auront eu le courage de lire jusqu'ici :)

Modifié par Spidetra
Lien vers le commentaire
Partager sur d’autres sites

Je ne répond pas directement à ta question sur le bit bashing que je ne connais pas.

Je te livre ma modeste expérience en espérant qu'elle pourra t'aider.

Il y a trois paliers de difficulté :

1. Catalogue sur 1 niveau (pas de relation parent-enfant entre les produits) et pas de règle conditionnelle entre les options (par exemple "l'option 1A est incompatible avec l'option 2B").

Dans ce cas tu peux t'en tirer en programmation "classique" :

une table de produits, une table dépendante avec les options qiu peuvent prendre telle ou telle valeur, les options elles-mêmes dépendent d'une table "type d'option" avec des propriétés : par exemple le type "couleur" additionne la valeur de l'option à la valeur base du produit (surcoût), le type "quantité" multiplie la valeur base du produit par la valeur de l'option (1, 2, 3..).

2.Catalogue sur n niveaux (hierarchies parent enfant) : la difficulté est d'impacter les modifications des nomenclatures enfants sur celles des parents. difficile à faire en SQL "classique".

3. Règles conditionnelles entre les options : par exemple l'option 1A est incompatible avec l'option 2B

Là tout se complique.

Pour une configuration choisie par le client, tu dois détecter les règles, et les appliquer jusqu'à épuisement : par exemple au pas No1 l'option 2B est interdite donc au pas No 2 l'option 3C est interdite, etc...

Pour optimiser le traitement, il existe des techniques de programmation de contrainte avec des algorithmes répondant au doux noms de arc consistency, hill climbing, ...

Perso j'ai déjà développé une gestion d'option sur des produits en .NET et javascript au niveau de difficulté 2.

pour le niveau 3 j'ai travaillé sur des algorithmes mais je n'ai jamais eu le temps de terminer le développement.

Si je peux t'aider plus précisément tu peux me MP.

Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)

merci d'avoir pris le temps de me répondre ( et surtout de me lire )

Le niveau de contraintes pour les options est de niveau 1.

Il est relativement facile de gérer de manière classique par des tables annexes.

Le choix est imposé par une nouvelle contrainte :

La liste des disponibilités doit être mise à jour en temps réels en fonction des choix de l'utilisateur.

Ajax et mode Web 2.0 obligent ;)

Je ne peux plus me permettre d'aller faire une requête en me liant avec les différentes tables pour aller choisir les bonnes options.

D'où mon intérêt pour les techniques de bit bashing.

Le SELECT va devenir mono-table, avec une seule condition sur un champ en BIGINT qui sera indexé.

J'ai besoin d'une requête très performante et j'espère qu'un tel choix me permettra de gagner en perf.

Modifié par Spidetra
Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

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



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