2010-05-05 8 views
0

J'ai lu un certain nombre de solutions pour une table d'amitié Facebook mysql et j'ai choisi une table assez simple avec deux champs user_a et user_b. J'utiliserais alors une requête avec UNION pour obtenir une liste de tous les amis d'un utilisateur (comme ils pourraient l'être dans user_a ou user_b). Ma question est maintenant ... est-il préférable d'avoir un ID unique incrémentation automatique ou un identifiant composé?Meilleure clé primaire pour une table d'amitié

tableau 1)

user_a, Utilisateur_b

tableau 2)

id_unique, user_a, Utilisateur_b

Répondre

1

Mes commentaires:

  • soit l'approche de la clé est très bien . Je préférerais un compound key sur surrogate key pour économiser l'espace et d'éviter des index supplémentaires
  • vous pourriez avoir besoin d'une clé de substitution si - certaines lignes d'accès ne fonctionnent pas avec les touches composées

Mise à jour:

Vous pouvez envisager cette amitié est une rue à double sens. Tout simplement parce que UserA a un lien d'amitié avec UserB ne signifie pas que UserB s'est lié à UserA. Si vous suivez les deux côtés, cela facilite vos requêtes. Dans ce cas, vous faites:

Friend 
------- 
UserID 
FriendUserID 

Donc, vous êtes correspondant uniquement sur la colonne UserID pour obtenir la liste des amis de l'utilisateur. Si deux utilisateurs s'aident, vous mettez deux lignes dans la table. Si un utilisateur en supprime un autre, vous supprimez cette ligne.

+0

J'ai considéré ce dernier point .... mais que se passerait-il si les deux utilisateurs étaient impairs ou pairs? – Mark

+0

@mark: bon point, pas de café encore ... mis à jour – RedFilter

+3

Bon point, car souvent deux personnes étranges seront amis ... –

0

S'il est vrai que la solution de clé composée semble être plus élégante d'un point de vue design et moins encombrante à première vue, il y a des circonstances dans lesquelles je choisirais plutôt un identifiant numérique incrémenté automatiquement.

Si l'amitié est référencée ailleurs, elle économisera plus d'espace sur le long terme pour avoir un ID numérique unique en tant que clé étrangère dans la table de référence qu'un ID composé. De plus, un index sur un identifiant unique sera (légèrement) plus court et plus rapide qu'un index composite si vous interrogez souvent sur l'identifiant d'ami.