2012-09-04 3 views
1

J'ai une base de données existante qui est structuré comme suit:Database Design - une table ou plusieurs tables/joint

user 
user_profile 
user_permissions 
user_statistics 

Chaque table a une colonne unique qui est utilisé pour joindre chaque table ensemble, comme suit:

SELECT * 
FROM user 
INNER JOIN user_profile ON user.user_id = user_profile.user_profile_id 
INNER JOIN user_permissions ON user.user_id = user_permissions.user_permissions_id 
INNER JOIN user_statistics ON user.user_id = user_statistics.user_statistics_id 
WHERE user_id = 1 

Y a-t-il quelque chose qui ne va pas dans ce cas ou est-il préférable de créer une table avec beaucoup de colonnes, de sorte qu'aucune jointure ne soit nécessaire?

Répondre

3

Ceci est une conception de base de données classique; il est appelé "normalization", et est généralement considéré comme la meilleure pratique.

Il existe des raisons de dénormaliser une base de données - les performances sont les plus classiques. Cependant, cela se fait généralement au détriment de la maintenabilité et de la cohérence. Cela n'a généralement de sens qu'aux extrêmes de la taille des données - le schéma que vous décrivez doit évoluer vers un grand nombre d'enregistrements sans que les jointures ne deviennent un problème.

Je suppose également que plusieurs des tables liées à "utilisateur" ont plus d'un enregistrement pour un utilisateur donné - "statistiques" a généralement beaucoup de lignes pour un utilisateur donné; les autorisations peuvent également avoir une ligne pour l'autorisation de chaque utilisateur. Modéliser cela dans une seule grande table serait horrible.

Certains concepteurs aiment créer des tables séparées pour les données qui sont logiquement séparées. Ainsi, votre conception peut inclure une table "user_profile" avec une seule ligne par utilisateur car le concepteur a estimé que cette donnée est logiquement séparée de "user" - elle change par exemple dans des circonstances commerciales différentes. C'est surtout une question de style, à mon avis. Dans ce cas, les jointures ne ralentissent pas votre base de données - le but d'une base de données relationnelle est d'être très efficace dans la gestion de ce type de scénario («relationnel» fait référence au fait que les données peuvent être liées).

+0

OK, donc en termes de meilleures pratiques, la seule fois où je besoin de partager mes données lorsque j'ai un seul enregistrement d'utilisateur dans "utilisateur" et plusieurs enregistrements qui se rapportent à l'enregistrement de l'utilisateur dans les autres tableaux comme les statistiques et les autorisations? L'utilisation de jointures ralentit-elle la requête de la base de données? – Reado

+0

Il * peut * l'accélérer; Cela dépend de la nature des données que vous stockez. –

+0

Les jointures vous ralentiront si vous n'indexez pas correctement. Le FK devrait avoir un index et toutes les bases de données ne le donneront pas automatiquement dans le cadre de la création du FK. Vous pouvez avoir besoin de relations en tête-à-tête si vous avez des champs qui seront rarement remplis (ou requêtes) ou des tables très larges. Des tables très larges peuvent entraîner des performances lentes ou une incapacité à ajouter les informations dont vous avez besoin en raison des contraintes de taille d'enregistrement. – HLGEM

0

Il est préférable de rendre la base de données relationnelle, comme elle est. Cette structure élimine le risque d'anomalies de données et est prête pour des changements d'échelle et de spécificités de domaine (par exemple, que se passe-t-il lorsque vous ajoutez un nouveau type de permission?)

Les JOINs font naturellement partie de ce que font les bases de données. efficace.

Les détails de pourquoi cela est une bonne pratique sont réunis dans ce que nous appelons database normalization