Il est préférable de mettre tous les attributs dans le même tableau.
Si vous commencez à stocker des noms d'attributs dans une table, vous stockez des métadonnées dans votre base de données, qui rompt la première forme normale. En outre, les conserver tous dans la même table simplifie vos requêtes.
Auriez-vous plutôt:
SELECT show_photos FROM User WHERE user_id = 1
Ou
SELECT up.show_photos FROM User u
LEFT JOIN UserPrivacy up USING(user_id)
WHERE u.user_id = 1
Les relations sont de bien, mais les garder pour associer des entités distinctes et 1-> N relations.
Il y a une limite au nombre de colonnes, et seulement si vous pensez que vous pourriez atteindre cette limite, feriez-vous autre chose.
Il existe des raisons légitimes de stocker des paires de valeurs de nom dans une table distincte, mais la crainte d'ajouter des colonnes n'en fait pas partie. Par exemple, la création d'une table de valeurs de nom peut, dans certaines circonstances, faciliter l'interrogation d'une liste d'attributs. Cependant, la plupart des moteurs de bases de données, y compris PDO en PHP, incluent des méthodes de réflexion grâce auxquelles vous pouvez facilement obtenir une liste de colonnes pour une table (attributs pour une entité).
Veuillez également noter que votre champ id sur User doit être user_id, pas seulement id, à moins que vous n'utilisiez Ruby, qui force seulement l'identifiant. 'User_id' est préféré car avec id juste, votre joint ressemble à ceci:
ON u.id = up.user_id
Ce qui semble étrange, et la façon préférée est la suivante:
ON u.user_id = up.user_id
ou plus simplement:
USING(user_id)
N'ayez pas peur d'ajouter un autre attribut. C'est normal, et ça va.
Qu'entendez-vous par "Mieux"? Plus rapide? Moins cher? Plus simple? Plus de mémoire utilisée? Plus d'E/S utilisées? Taux plus élevé facturable? Plus de sécurité d'emploi? –
Je pense, l'heure est à peu près la même, la mémoire aussi, mais les E/S en utilisant - cela vaut la peine d'examiner – Robert