Quelle serait une meilleure conception de base de données pour un site Web de réseau social? Une seule table avec plus de colonnes et moins de lignes, ou plusieurs tables avec moins de colonnes mais plus de lignes?
Par exemple: un utilisateur peut publier une mise à jour sur son mur ou dans un groupe.
Je peux penser à deux conceptions de bases de données:
Conception 1
UserPosts
- id
- identifiant d'utilisateur
- Publier
- datetime
UserGroupPost :
- id
- groupId
- identifiant d'utilisateur
- Publier
- datetime
Problème potentiel : pourrait nécessiter des jointures, ce qui peut (à l'avenir) être une requête lente.
Conception 2
Messages :
- id
- identifiant d'utilisateur
- groupId
- Publier
- datetime (où groupid serait nul si l'utilisateur poste sur son mur)
Problème potentiel : la boucle sur un grand ensemble de données peut prendre un (long) temps.
Comment obtenir de meilleures performances lorsque les données augmentent? Existe-t-il un autre (meilleur) moyen?
mysql
database-design
Siddharth Patel
la source
la source
Réponses:
Mon inclinaison ici serait toujours l'option de conception 1, ou du moins le long de ces lignes. Ne vous inquiétez pas trop d'essayer d'éliminer la nécessité de joindre des tables dans les requêtes futures - toute base de données normalisée va utiliser des jointures dans toutes les requêtes utiles, c'est juste des bases de données relationnelles.
De plus, pourquoi devez-vous nécessairement rejoindre les tables userPosts et userGroupPosts pour votre site Web? Ne seraient-ils pas affichés séparément? La seule raison pour laquelle vous rejoindriez ces tables est peut - être lors de la recherche de publications, mais il ne devrait pas être trop difficile d'écrire des requêtes efficaces pour cela. En dehors de cela, vous pouvez finir par vouloir interroger les tables à des fins d'analyse, mais ce n'est pas le but principal de cette base de données.
Le design 2 pourrait au moins signifier que vous vous retrouvez avec une table très occupée.
La meilleure option serait cependant de prototyper chacun et d'exécuter quelques tests. Créez un prototype de chaque option de conception et effectuez une analyse comparative des performances sur différentes opérations avec des données factices.
la source
Pour moi, selon votre structure actuelle, Design 2 est meilleur. Vous pouvez implémenter le partitionnement, une requête optimisée et un moyen structuré pour créer une base de données / table diminuera le temps d'exécution. Mais la normalisation de certains cas fonctionne mieux, mais dépend totalement de l'architecture de conception de votre base de données.
la source