2010-12-05 13 views
1

J'ai une table mysql avec mes utilisateurs ... chaque utilisateur a divers attributs comme Vérifié (oui/non), Membre (oui/non) etc .. Je n'ai pas besoin d'expliquer plus. .est un cas très fréquent ...Meilleure pratique d'architecture Mysql: attributs utilisateur

je suis toujours content à l'aide de construire mes tables avec des lignes simples comme celui-ci, peut-être pour ou lazyness juste parce que je ne construit grand DB jusqu'à présent ...

userId | userName | Verified | Member 
--------------------------------------- 
    3213 | Jon  | 1  | 0 

mais je me demande s'il y a des avantages à le construire dans des tables séparées, et créer des relations plus tard, comme

Tableau utilisateur

userId | userName | 
------------------- 
    3213 | Jon  | 

table Membre

memberId | userId | Member | 
-------------------------------- 
    555748 | 3213  | 0  | 

Tableau Verifications

memberId | userId | Verified | 
---------------------------------- 
    555748 | 3213  | 1   | 

ce qui est le véritable avantage de ce second choix?

+0

Vous pouvez vous familiariser avec [normalisation de la base de données] (http://en.wikipedia.org/wiki/Database_normalization) – khachik

Répondre

4

Il n'y a pas de réel avantage ici, seulement des inconvénients. Il existe une relation 1: 1 entre les tables, et maintenant vous devez joindre les deux tables pour obtenir l'état de vérification d'un utilisateur. En outre, il y a plus de cas possibles maintenant: un utilisateur peut être vérifié (1) non vérifié (0) ou l'enregistrement peut ne pas exister.

Vous pouvez mieux placer ces champs supplémentaires dans la même table, sauf s'il existe une relation 1 à plusieurs. Par exemple, un utilisateur peut avoir des publications, des amis, des images, que vous stockez dans une table séparée, car vous ne savez pas combien vous devez sauvegarder.

+0

super, en fait, c'est ce que j'ai fait, maintenant je vois le point ... merci! – Francesco

2

Faites-le dans un premier temps, il consomme moins d'espace et est propably plus rapide aussi longtemps que c'est une relation 1: 1.

0

Le point de séparation est de permettre un à plusieurs, plusieurs à un ou plusieurs à plusieurs enregistrements. Tant qu'aucun de vos champs de données ne peut contenir les mêmes informations, une table plate est préférable.

0

Je le simplifierais probablement un peu. Comme il n'y a aucune valeur à avoir un drapeau qui indique l'adhésion/vérification. La séparation de table fait cela pour vous. De même, vous n'avez pas besoin d'userId dans chaque table. Vous avez probablement une table UserMember, qui contient à la fois l'identité de l'utilisateur et du membre. Donc, avoir la relation est suffisant. De plus, si vous avez une relation 1: 1, vous pouvez aussi avoir le drapeau dans la même table. Avoir une relation 1: x est plus approprié pour la normalisation.