Il y a deux options que je peux voir, tous deux donneront essentiellement le même résultat:
FK de dbo.aspnet_User.UserID
à dbo.Profile.UserID
, puis définir une clé unique sur dbo.Profile.UserID
(sauf si vous utilisez comme le PK la colonne pour dbo.Profile
)
FK de dbo.aspnet_Profile.ProfileID
à dbo.Profile.ProfileID
dbo.aspnet_User
est logiquement 1 - 1 avec dbo.aspnet_Profile
, donc peu importe l'approche que vous utilisez car vous obtiendrez toujours la même intégrité relationnelle. Si vous remplacez la table de données de profil standard par votre propre implémentation, il est plus logique d'utiliser la première suggestion, sinon, si vous étendez le schéma Profile, utilisez la deuxième suggestion.
EDIT
aspnet_Profile
est la table standard - les SqlProfileProvider
standards stocke les données de profil de l'utilisateur comme un sac de propriété sérialisé dans aspnet_Profile
, donc pourquoi il n'y a pas de table aspnet_ProfileData
distinct.
Cette approche permet de personnaliser facilement le schéma de profil pour différentes applications sans nécessiter de modification de la base de données sous-jacente. C'est la solution la plus optimale pour un framework tel que .NET. L'inconvénient est que SQL Server n'a aucun accès facile à ces données, il est donc beaucoup plus difficile d'indexer, mettre à jour et interroger les données de profil de l'utilisateur en utilisant T-SQL et la logique basée sur les ensembles.
L'approche la plus courante que j'ai vu pour supprimer cette limitation est d'étendre la norme SqlProfileProvider
pour écrire dans une table de données de profil personnalisé qui a des colonnes spécifiques pour les propriétés de profil spécifiques à l'application. Cette table a naturellement une relation 1-1 avec la table aspnet_Profile, donc elle a une clé étrangère comme indiqué ci-dessus.
Le rôle du fournisseur étendu consiste à promouvoir des propriétés de profil spécifiques pour les colonnes pendant les écritures de profil et à les lire dans les colonnes lorsque le profil est extrait.Cela vous permet de mélanger les solutions de stockage en fonction des besoins, à condition que votre fournisseur étendu sache comment revenir à l'implémentation standard où il ne «connaît» pas une propriété donnée. Je pense toujours qu'il est préférable de laisser les tables d'appartenance standard telles quelles et de les étendre si nécessaire en utilisant de nouvelles tables avec des clés étrangères appropriées, puis de sous-classer le fournisseur approprié et de surcharger les méthodes du fournisseur avec votre propre implémentation. mise en œuvre de base dans la mesure du possible).
Merci Sam - qu'est ce que le "tableau de données de profil standard"? Est-ce aspnet_Profile? Je ne vois rien qui s'appelle dbo.apsnet_ProfileData. Pourriez-vous également élaborer sur la différence entre le remplacement et l'extension du schéma de profil. Si je conçois une classe UserProfile qui hérite de ProfileBase afin que je puisse ajouter plus de métadonnées à MyDB, je suppose que je suis en train de l'étendre? Merci encore. –
Voir ma réponse éditée ci-dessus. – Sam
Salut Sam. Je suis encore en train de travailler là-dessus - j'ai été distrait par un autre problème mais je veux y revenir. J'ai crédité le vôtre comme réponse, mais j'ai une question de suivi connexe que je publierai dans un jour ou deux. Merci encore pour votre aide. –