2009-02-24 4 views
1

Je suis dans le dilemme, je ne sais pas lequel est le meilleur. (J'utilise php et mysql btw)Est-ce que je devrais stocker en tant que "chaînes" ou "entiers" en php et mysql?

Disons que je suis en train de développer un site communautaire communautaire. Un utilisateur peut ajouter autant d'amis qu'il le souhaite. Dans ma base de données, j'ai une table d'utilisateurs dont les détails de l'utilisateur du magasin incluent les amis de l'utilisateur. Dois-je stocker les amis de l'utilisateur dans:

Chaînes => john; bryan; sam; paul; ...;

ou

Entiers => 1; 21; 50; 1779; 30; ...; Chaîne signifie stocker leur nom d'utilisateur.

Entier signifie stocker leur identifiant d'utilisateur.

Lequel est le meilleur?

Si la chaîne, ce serait une très, très grande chaîne (imaginez les utilisateurs ont 400 amis, et certains noms d'utilisateur sont extrêmes à long)

Si id, comment la liste d'amis sur la page de profil d'utilisateur? Obtenir la liste des identifiants dans une longue chaîne (séparés par un point-virgule), utilisez la fonction explode pour la transformer en tableau. Puis en utilisant des boucles pour afficher ?? N'est-ce pas gênant? Est-ce qu'il y a un autre moyen? Si oui, s'il vous plaît montrer un exemple de code ..

OU normalement, comment auriez-vous les gars pour stocker la liste "amis" dans la table des utilisateurs?

Répondre

8

Ne les stockez pas sous la forme d'un point-virgule délimité quoi que ce soit. Stockez-les en tant qu'ID utilisateur dans une table de recherche. Supposons que l'utilisateur est # 2. Vous pourriez avoir:

SourceUserID | FriendUserID 
2    1 
2    21 
2    50 
2    1779 
2    30 
1    // One of John's friends 

ensuite pour afficher la liste d'amis, vous interroger cette table restreindre par SourceUserID = 2 et rejoindre contre la table utilisateur pour obtenir les noms. Par exemple:

SELECT Name FROM SITE_USERS 
INNER JOIN USER_FRIENDS ON SITE_USERS.ID = USER_FRIENDS.FriendUserID 
WHERE SourceUser = ? 

(ou quel que soit le format de votre requête paramétrées est, remplir le paramètre avec l'ID de l'utilisateur dont la page vous affichez.)

+0

Pourquoi ?? Serait-il plus rapide (plus rapide dans la récupération des données) si j'utilise la requête INNER JOIN? – roa3

+0

Pourquoi quel bit? Ne pas stocker les choses sous la forme d'une liste délimitée par des points-virgules?Cela prend une collection de données (les bases de données sont * bonnes * pour stocker des collections de données dans des tables - c'est ce qu'elles sont) et les transformer en une chaîne sans raison. Après les avoir transformés en chaîne, vous ne pouvez pas travailler dessus. –

5

Normalement, vous créez une troisième table "users_friends", avec deux colonnes, userId et friendId, les deux composant la clé primaire. Un rapide Google est venu avec ceci: http://www.tekstenuitleg.net/en/articles/database_design_tutorial/8, mais vous pourriez vouloir rechercher d'autres articles sur "des relations de many-to-many".

+0

pouvez-vous être plus de détails? – roa3

+0

Je suis un peu noob .. hum .. nouveau à la programmation – roa3

+0

Vérifiez ce lien que j'ai posté, ou Google "relations many-to-many", vous devriez trouver beaucoup d'informations. –

0

Cela nécessite ce qui est appelé plusieurs à plusieurs (un ami peut appartenir à de nombreux utilisateurs et les utilisateurs peuvent avoir beaucoup d'amis) donc vous devez créer une troisième table pour stocker le lien, la table aura un ID unique, un ID ami et un ID utilisateur,

Pour obtenir un utilisateurs amis dont vous avez besoin pour écrire une instruction SQL jointe, par exemple

SELECT Friends.FriendName FROM UserFriends 
    INNER JOIN Friends ON Friends.FriendId = UserFriends.FriendId 
    WHERE UserID = @intUserId 

(@intUserId de l'utilisateur pour lequel vous voulez lister les amis pour)