Bonjour,
Je suis confronté à un problème de conception dans mon projet. J'aurai besoin d'avis sur la meilleure manière de modéliser certaines relations métiers dans mon projet.
Le projet porte sur une application de "social shopping".
Pour commencer je dispose d'entité métier :
USER (utilisateur)
BRAND (marque)
RETAILER (revendeurs)
PRODUCT (produit)
OFFER (offre commerciale)
Je souhaite implémenter différentes "actions" sociales du type:
VIEW (vue)
FOLLOW (suivre)
LIKE (aime)
SHARE (partage)
etc..
Ces actions sont réalisées par l'utilisateur et peut porter l'ensemble des entités citées.
Par exemple USER FOLLOW BRAND, USER LIKE PRODUCT, USER SHARE OFFER.
Mon problème est que justement une action peut pointer vers différents objets(tables) et je n'arrive pas à trouver la bonne solution.
J'ai penser à plusieurs solutions mais je ne suis pas convaincu par celles-çi :
1- L’HÉRITAGE:
Je pourrai créer un héritage sur mes entités,
Simple, mais je doute des performances.
Ces 5 entités sont les entité principales de l'application et Je me retrouverai à devoir requêter la table SOCIAL_ITEM sur toutes mes requêtes.
Cette table mélangera des objets métiers complétement différents et va vite obtenir une taille phénoménale.
Si j'ai 1000 marques et 100 000 produits par exemple je devrai parcourir à chaque fois 101000 enregistrements juste pour trouver mes 1000 marques..
Je me retrouverai avec un id commun pour ses objets différents (user 1, user 2, marque 3, produit 4... ) pas gênant en soi mais pas très élégant..
2- LA DELEGATION
AVEC UN OU EXCLUSIF SUR LES AGRÉGATIONS.
Un peu moins simple..
Problème : Partant des entités, je peut remonter vers SOCIAL_ITEM grace à l' ID_SOCIAL_ITEM présent dans chaque entité mais inversement je ne peut pas trouver l'entité correspondant au SOCIAL_ITEM.
Je pourrai ajouter dans SOCIAL_ITEM les champs ID et TYPE, pour gérer la relation inverse mais dans ce cas je ne pourrai pas placer de Clé étrangère sur cet ID et donc problème de performance à long terme.
Peut-être sinon mettre des champs ID_USER, ID_BRAND, ID_RETAILER, ... dans la table SOCIAL_ITEM et gérer le ou exclusif par trigger.. mais je ne pense pas que cela soit non plus une bonne pratique..
De plus cela commence à être compliqué si je souhaite récuperer seulement un type de SHARE.. par exemple récupérer seulement les produits partager par l'utilisateur.
3 -UNE SIMPLE ASSOCIATION
TOUJOURS AVEC LE OU EXCLUSIF A GERER
Encore complexe.. de nombreuses tables de jointures à mettre en place.. toujours la gestion du ou exclusif et de la relation inverse.
4 - ECLATER LE MODELE EN MULTIPLE TABLE
plus de ou exclusif, plus de problème d'inverse, simple à utiliser.
problème de nombreuses tables, devient vite exponentielle si je rajoute des actions et entités.
plus de gestion commune des partages. devoir travailler sur X table pour gérer une même action, dupliquer tout les champs de chaque action sur X tables (et donc d'objets)
CONCLUSION :
Je patauge...je ne sais pas si je me complique la vie pour rien ou si je suis totalement à coté de la plaque , je ne sais pas quel modèle est le plus propre et performant..
Je tourne en rond dans ma réflexion..
S'il vous plait aider moi si vous connaissez la solution de ce type de problème ou si vous avez des idées..
Merci d'avance et désolé pour le roman
Partager