2010-08-03 5 views
0

Dans mon application, les utilisateurs peuvent être de trois types: les adolescents, les individus ou les membres d'une organisation. Dans ma table d'utilisateurs, j'ai un champ booléen adolescent (non nul) et une clé étrangère organization_id (null).Comment gérer plusieurs types d'utilisateurs?

Si teen est true et que organization_id est null, l'utilisateur est un adolescent. Les adolescents ne peuvent pas appartenir à une organisation.
Si teen est false et organisation_id est nul, l'utilisateur est un individu.
Si teen est false et organisation_id n'est pas nul, les utilisateurs sont membres d'une organisation.

Il doit y avoir une meilleure façon de procéder. Je n'aime pas que le cas existe où teen est vrai et organization_id n'est pas nul. Serait-il préférable d'ajouter une nouvelle table, organisations_users, et supprimer la clé étrangère organization_id de la table users? L'inconvénient que je vois à cela est que cela me prendra plus de temps pour déterminer si un utilisateur est un individu ou une organisation, et récupérer les données le cas échéant.

Existe-t-il une façon plus élégante de gérer cela?

Répondre

2

Il serait simplifier votre code si vous aviez une colonne de rôle qui avait adolescent, individu ou membre. Vous devez probablement normaliser ces rôles à leur propre table et utiliser une clé étrangère:

Roles 
1  Teen 
2  Individual 
3  Member of an Organization 
+0

+1 - mieux que ma réponse et il laisse place à de nouveaux types d'utilisateurs dans l'avenir. – JNK

+0

Comment puis-je rechercher des données dans la table d'organisation si j'ai déterminé que l'utilisateur était membre d'une organisation? – birderic

+0

@birderic, la recherche ne changera pas. Vous stockez toujours les données d'organisation pour les membres. Il y a une certaine redondance mineure si vous considérez le fait que vous pouvez calculer certaines de ces valeurs, mais cette redondance simplifie votre conception et votre code tout en augmentant la flexibilité. En passant, si les utilisateurs commencent à avoir plusieurs rôles, vous pouvez transformer la relation entre l'utilisateur et les rôles en un à plusieurs avec une autre table. –

0

Utilisez 2 tables. Le tableau 1 est une table utilisateur qui contient des informations sur l'utilisateur. Il contient également une clé étrangère à l'ID de la table suivante.

Le tableau 2 est UserType. L'identifiant est une identité. Cela contient "Adolescent", "Individuel" et "Organisation".

Pour faire une recherche, faites simplement une jointure.

1

Il me semble que vous vous êtes acculé à cette conception. En général, il est préférable de garder vos abstractions (modèles) en phase avec le monde réel, par opposition à un cas très particulier. Par exemple, un adolescent est une personne âgée de 13 à 19 ans (selon la définition). Un adolescent peut être membre d'un club de natation, qui est une organisation. Une personne de tout âge peut ou peut ne pas être membre d'une organisation. Je suggère ce qui suit:

teeen_model_v1

+0

Dans mon cas, les adolescents ne peuvent pas appartenir à des organisations (et n'auront jamais cette capacité). Voulez-vous dire qu'il est préférable de le permettre mais de le programmer avec force? – birderic

+0

Oui, permettez à votre modèle de suivre l'abstraction habituelle - celle déjà câblée - dans la plupart des cerveaux humains. Dans votre exemple, une personne qui se trouve être une adolescente n'aura tout simplement pas d'entrée dans la table d'adhésion. –

Questions connexes