Je suis un développeur de logiciels. J'adore coder, mais je déteste les bases de données... Actuellement, je suis en train de créer un site web sur lequel un utilisateur pourra marquer une entité comme étant a aimé (comme sur FB), étiquette et commentaire .
Je suis 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 j'ai besoin de l'activer pour 5 choses différentes (pour l'instant, mais je suppose aussi que ce nombre peut augmenter, à mesure que le service se développe).
J'ai trouvé des questions similaires ici, mais aucune n'a de réponse satisfaisante, alors je pose à nouveau cette question.
La question est de savoir comment le faire correctement, efficacement y élastiquement concevoir la base de données, afin qu'elle puisse stocker des commentaires pour différents tableaux , aime pour différents tableaux y tags pour eux. Un modèle de conception comme réponse serait le mieux ;)
Description détaillée : J'ai un tableau User
avec quelques données utilisateur, et 3 autres tableaux : Photo
con photographies , Articles
con articles , Places
con places . Je veux permettre à tout utilisateur connecté de :
-
commentaire sur l'un de ces 3 tableaux
-
marquer l'un d'entre eux comme aimé
-
étiqueter n'importe lequel d'entre eux avec une étiquette
-
Je veux également compter le nombre de likes pour chaque élément et le nombre de fois où ce tag particulier a été utilisé.
1 st approche :
a) Pour tags Je vais créer un tableau Tag [TagId, tagName, tagCounter]
alors je vais créer plusieurs à plusieurs relations tableaux pour : Photo_has_tags
, Place_has_tag
, Article_has_tag
.
b) Il en va de même pour les commentaires.
c) Je vais créer un tableau LikedPhotos [idUser, idPhoto]
, LikedArticles[idUser, idArticle]
, LikedPlace [idUser, idPlace]
. Nombre de aime sera calculé par demandes de renseignements (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 et approche :
Je vais créer une table ElementType [idType, TypeName == some table name]
qui sera rempli par l'administrateur (moi) avec les noms de tableaux qui peuvent être a aimé , comentó o Étiqueté . Ensuite, je vais créer tableaux :
a) LikedElement [idLike, idUser, idElementType, idLikedElement]
et la même chose pour les commentaires et les étiquettes avec les colonnes appropriées pour chacun. Maintenant, quand je veux faire une photo aimée, je vais l'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 qu'il manque quelque chose dans cette conception...
Enfin, je me demande aussi quel est le meilleur endroit pour stocker le compteur du nombre de fois où l'élément a été aimé. Je ne vois que deux possibilités :
- dans l'élément (
Photo/Article/Place
) table - par select count().
J'espère que mon explication du problème est maintenant plus complète.
0 votes
Avez-vous envisagé le XML ?
0 votes
Les nouveaux venus peuvent envisager des bases de données de graphes comme neo4j qui est conçu exclusivement pour traiter des connexions complexes