2010-09-22 14 views
1

Je dois modéliser des classes et des tables de base de données pour une entité "User".Comment modéliser ces classes/tables de base de données?

Cette entité « Utilisateur » ont cette propriétés:

User 
    Name 
    Age 
    Gender 
    Email 

Mais je le type de 2 utilisateur: « utilisateurs payants » et « les utilisateurs libres ». Chacun ont ses propres propriétés:

Paid User 
    Fee 
    Rate 

Free User 
    Expiration Date 
    Level 

« payé Utilisateur » et « utilisateur libre » sont différentes, mais les deux sont « Utilisateur ». J'utilise ASP.NET MVC, NHibernate et Fluent Maps.

Quelle est la meilleure façon et le bon modèle de conception pour modéliser ces classes et tables de base de données?

Merci beaucoup!

+0

Avec EF, vous pouvez définir les types d'utilisateurs droit sur le concepteur du modèle basé sur certaines conditions. Juste une suggestion. Je ne sais pas NHibernate. –

Répondre

3

Je trouve souvent la meilleure approche pour cela est d'utiliser un modèle d'héritage. Tous les champs communs vont dans le tableau User. Vous créez d'abord une entrée dans User, puis utilisez le résultat UserID pour créer des entrées supplémentaires dans Paid User ou Free User si nécessaire.

User 
    UserID 
    Name 
    Age 
    Gender 
    Email 

Paid User 
    UserID <-- FK to User 
    Fee 
    Rate 

Free User 
    UserID <-- FK to User 
    Expiration Date 
    Level 

Ensuite, vous pouvez choisir (ou créer un VIEW) comme ceci:

select u.UserID, U.Name, ... 
    pu.Fee, pu.Rate, 
    fu.ExpirationDate, fu.Level, 
    case when pu.UserID is null then 0 else 1 end as IsPaidUser, 
    case when fu.UserID is null then 0 else 1 end as IsFreeUser 
from User u 
left outer join PaidUser pu on u.UserID = pu.UserID 
left outer join FreeUser fu on u.UserID = fu.UserID 

Note: Le schéma ci-dessus est assez naïf et ne gère pas les cas où un utilisateur peut être un utilisateur libre, puis un utilisateur payant, puis un utilisateur libre à nouveau. La façon dont vous concevez cela dépend vraiment de votre application et de vos règles métier.

+0

Voici comment je le ferais. Vous pouvez également ajouter un déclencheur sur les tables PaidUser et FreeUser pour vous assurer qu'un utilisateur donné n'existe pas dans les deux tables. –

+0

D'accord avec le commentaire de Mike Forman. En outre, vous pouvez ajouter un champ dans le tableau Utilisateur pour indiquer s'il s'agit d'un utilisateur payant ou libre. – mbeckish

+0

@mbeckish: peut-être un utilisateur pourrait être à la fois ... J'ai ajouté des colonnes dans la sélection qui vous permettent de savoir si l'utilisateur est l'un ou l'autre ... – RedFilter

0

Quelles opérations pour ces types d'utilisateur?

Toute conception devrait commencer à partir des opérations puis des structures de données, pas inversement.

+0

Je, fondamentalement, besoin de rediriger l'utilisateur vers le bon contenu, base sur type d'utilisateur. Merci. – MCardinale

+0

Utilisez flag (bool) pour Free \ Paid. – gandjustas

2

En supposant que dans votre modèle d'objet utilisateur serait considérée comme abstraite considérer la définition suivante de la table utilisateur:

utilisateur
ID Nom
Âge
Sexe
Email
Type de < - gratuit/Payé/etc

Utilisateur payant
ID
UserID < --- FK à la table utilisateur
Frais
Taux

utilisateur gratuit
ID
UserID < --- FK à la table utilisateur
Date d'expiration
Niveau

Cela vous permettra d'interroger de cette façon:

Select * from utilisateur où Type = Gratuit

Questions connexes