Je suis un développeur de logiciels. J'adore coder, mais je déteste les bases de données ... Actuellement, je crée un site Web sur lequel un utilisateur sera autorisé à marquer une entité comme aimée (comme dans FB), à la taguer et à la commenter .
Je reste bloqué sur la conception des tables de base de données pour gérer cette fonctionnalité. La solution est triviale, si nous ne pouvons le faire que pour un seul type de chose (par exemple, des photos). Mais je dois l'activer pour 5 choses différentes (pour le moment, mais je suppose également que ce nombre peut augmenter à mesure que l'ensemble du service se développe).
J'ai trouvé des questions similaires ici, mais aucune d'entre elles n'a de réponse satisfaisante, alors je pose à nouveau cette question.
La question est de savoir comment concevoir correctement, efficacement et élastiquement la base de données, afin qu'elle puisse stocker des commentaires pour différentes tables , des likes pour différentes tables et des balises pour elles. Un modèle de conception comme réponse sera le meilleur;)
Description détaillée : J'ai un tableau User
avec quelques données utilisateur, et 3 autres tableaux : Photo
avec des photos , Articles
avec des articles , Places
avec des lieux . Je souhaite permettre à tout utilisateur connecté de:
commenter l'un de ces 3 tableaux
marquer l'un d'entre eux comme aimé
taguer l'un d'eux avec un tag
Je veux également compter le nombre de likes pour chaque élément et le nombre de fois que cette balise particulière a été utilisée.
1 er approche :
a) Pour les étiquettes , je vais créer un tableau Tag [TagId, tagName, tagCounter]
, je vais créer beaucoup à plusieurs relations tables pour: Photo_has_tags
, Place_has_tag
, Article_has_tag
.
b) La même chose vaut pour les commentaires.
c) Je vais créer un tableau LikedPhotos [idUser, idPhoto]
, LikedArticles[idUser, idArticle]
, LikedPlace [idUser, idPlace]
. Le nombre de likes sera calculé par des requêtes (ce qui, je suppose, est mauvais). Et...
Je n'aime vraiment pas ce design pour la dernière partie, ça sent mauvais pour moi;)
2 ème approche :
Je vais créer une table ElementType [idType, TypeName == some table name]
qui sera remplie par l'administrateur (moi) avec les noms des tables qui peuvent être aimées , commentées ou étiquetées . Ensuite, je créerai des tableaux :
a) LikedElement [idLike, idUser, idElementType, idLikedElement]
et la même chose pour les commentaires et les balises avec les colonnes appropriées pour chacun. Maintenant, quand je veux faire une photo aimée, je vais insérer:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)
et pour les lieux:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)
et ainsi de suite ... Je pense que la deuxième approche est meilleure, mais j'ai aussi l'impression que quelque chose manque également dans cette conception ...
Enfin, je me demande aussi quel est le meilleur endroit pour stocker le comptoir pour combien de fois l'élément a été aimé. Je ne peux penser qu'à deux façons:
- dans la
Photo/Article/Place
table element ( ) - en sélectionnant count ().
J'espère que mon explication de la question est maintenant plus approfondie.