1

Si j'ai deux tables - logins et des utilisateurs, comme suit:Comment déterminer où placer la clé étrangère dans ce scénario?

Logins 
LoginIdNo 
UserIdNo 
HashedPassword 

Users 
UserIdNo 
LoginIdNo 
Username 

Chaque connexion « a un utilisateur » et chaque utilisateur « a une connexion » mais qui « appartient à » qui?

S'agit-il simplement d'un appel de jugement ou existe-t-il une formule de passage à blanc pour déterminer où la clé étrangère doit résider?

Répondre

2

C'est un-à-un. Où vous mettez la clé étrangère est probablement décidé par optionalité dans ces cas.

Y a-t-il une raison particulière pour laquelle vous avez divisé ceci en deux entités? Je ne suis pas un grand fan des mappings one-to-one, en particulier sur les ORM comme JPA où ils sont difficiles à implémenter (si vous utilisez la clé primaire de l'un comme clé étrangère à l'autre).

Dans votre système, quelle est la différence entre un identifiant et un utilisateur? Si une connexion devait se produire chaque fois qu'un utilisateur se connecte (c'est-à-dire une piste d'audit de l'activité de l'utilisateur), alors vous avez une relation un-à-plusieurs entre l'utilisateur et la connexion.

Mais dans ce cas où le nom d'utilisateur est dans une table et le mot de passe dans un autre et il y a une relation un-à-un entre les deux, vous devez demander pourquoi ils sont séparés.

+0

Il y a deux différences entre Login et User auxquelles je pensais. L'un est la table de l'utilisateur aurait beaucoup d'autres champs pour les informations de contact (adresse, téléphone, etc). Alors que la table Logins serait plus fragmentée en termes de données, la table dans son ensemble pourrait subir une forme de cryptage indépendante de mon application (je ne sais pas exactement comment cela serait fait). –

+0

Votre exemple de piste d'audit constitue un bon point. Inversement, si une trace d'audit est requise pour chaque modification des données utilisateur, la clé étrangère est peut-être l'ID de connexion, sauf si les informations de connexion sont également auditées - si l'utilisateur et le login ont des traces d'audit. fonctionne - dans ce cas peut-être nous avons aussi besoin d'une table UserAudit et LoginAudit? –

+0

@fraggle: Je préfère penser à cette distinction en tant que personne et utilisateur, ce qui est une décision de modélisation raisonnable. Mais si vous faisiez ce nom d'utilisateur et mot de passe serait probablement sur la même entité. – cletus

1

Puisqu'un login ne sera jamais associé à plus d'un utilisateur (et vice-versa), c'est une décision arbitraire de la façon dont vous définissez la relation (et donc où vous placez la clé étrangère). À moins que vous aussi allez ajouter d'autres attributs (Firleds) ou utiliser des rôles, il est peut-être plus simple de définir simplement comme ceci:

Users 
    UserIdNo 
    Username 
    HashedPassword