Dans l'ensemble, je ne vois pas de gros défauts dans votre configuration ou votre schéma actuel.
Ce que je me demande, c'est votre division en 3 tables User*. Je comprends ce que vous voulez que votre intention était (avoir différentes choses liées à l'utilisateur séparées) mais je ne sais pas si j'irais avec exactement la même chose. Si vous prévoyez d'afficher uniquement les données de l'User
table sur le site, c'est bien, puisque les autres informations ne sont pas nécessaires plusieurs fois sur la même page mais si les utilisateurs doivent utiliser leur vrai nom et afficher leur vrai nom (comme John Doe au lieu de doe55) cela ralentira les choses quand les données grossissent puisque vous pouvez nécessitent des jointures. Avoir les Preferences
séparer semble être un choix personnel. Je n'ai aucun argument pour ou contre.
Vos tables plusieurs-à-plusieurs n'auraient pas besoin d'un PK supplémentaire (par exemple, PostFavoriteID
). Un primaire combiné des deux PostID
et UserID
serait suffisant puisque PostFavoriteID
n'est jamais utilisé ailleurs. Cela vaut pour toutes les tables de jointure
Comme avec la préc. réponse, je ne vois pas d'avantage ou d'inconvénient. Je peut mettre les deux dans la même table depuis le NULL
(ou peut-être mieux -1
) les valeurs ne me dérangeraient pas.
Je les mettrais dans la même table en utilisant un déclencheur pour gérer l'incrément du ViewCount
tableau
Vous utilisez un schéma normal pour que tout ajout puisse être fait à tout moment.
Je ne peux pas vous dire, je ne l'ai pas encore fait, mais je sais que Solr est très puissant et flexible, donc je pense que vous devriez vous en sortir.
Il y en a beaucoup fils ici sur SO discuter de cela. Personnellement, j'aime mieux une clé de substitution (ou une autre clé numérique unique si disponible) car elle rend les requêtes plus faciles et plus rapides car un int est recherché plus facilement. Si vous autorisez un changement de nom d'utilisateur / e-mail / quel que soit votre PK, des mises à jour massives sont nécessaires. Avec la clé de substitution, vous n'avez pas besoin de vous embêter.
Ce que je ferais aussi, c'est d'ajouter des choses comme created_at
, last_accessed
à (mieux fait via des déclencheurs ou des procédures IMO) pour avoir des statistiques déjà disponibles. Cela peut vraiment vous donner des statistiques précieuses
D'autres stratégies pour augmenter les performances seraient des choses comme le cache mémoire, le cache de compteur, les tables partitionnées,... De telles choses peuvent être discutées lorsque vous êtes vraiment dépassé par les utilisateurs car il peut y avoir des choses/technologies/techniques/... qui sont très spécifiques à votre problème.