2014-05-07 4 views
0

Comment puis-je installer un tableau des groupes de suivre la relation avec la liste des utilisateurs:SQL: clé étrangère avec enfants multiples valeurs

Par exemple, permet de dire que j'ai table des utilisateurs:

   user_list 
----------------------------------- 
first_name | Last Name | user_id | 
----------------------------------- 
    john | Appleseed | 4  | 
    Jasmin | Applejuice | 6  | 

maintenant Je veux créer une table de groupes. Comment puis-je créer une table dans laquelle les utilisateurs peuvent être inclus dans un groupe ou plusieurs groupes. Par exemple, John est inclus dans le Apple_group mais également inclus dans le Orage_group. Jasmin est seulement inclus dans le Orange_group:

     groups 
---------------------------------------------------- 
    group_name | included_users_ids | group_id | 
---------------------------------------------------- 
    Apple_group |  4    | 1  | 
    Orange_group |  4, 6   | 6  | 

En supposant que la table user_list existe déjà, comment pourrais-je configurer la table des groupes? En outre, j'ai lu (voir le lien ci-dessous) que je ne devrais pas inclure plusieurs valeurs dans une seule colonne.

Inserting a foreign key with multiple values

Alors, mes questions sont les suivantes:

  1. Quelle serait la façon appropriée de configurer la table des groupes?

  2. Que serait le SQL pour le faire?

  3. Comment cela serait-il traité avec PHP quand on veut définir un utilisateur pour un groupe?

Répondre

1

Vous devez créer une troisième table, appelée "table de jointure".

users (
    id, 
    name 
); 

groups (
    id, 
    first_name, 
    last_name 
); 

groups_to_users (
    user_id, 
    group_id 
); 

Ensuite, créez une entrée dans la table groups_to_users pour chaque groupe un utilisateur est membre (ou, vous pouvez le dire d'une autre manière, une entrée pour chaque utilisateur qui se trouve dans un groupe). C'est une relation n: n (many-to-many). Si vous recherchez "normalisation de la base de données", comme je vous l'ai mentionné dans une réponse à une question précédente, vous apprendrez tout sur ce sujet.

Si vous voulez obtenir tous les groupes d'un utilisateur, vous feriez quelque chose comme:

SELECT g.* FROM groups_to_users gtu 
LEFT JOIN groups g ON gtu.group_id=g.id 
WHERE gtu.user_id = :UserId 

Si vous voulez obtenir, vous feriez les utilisateurs d'un groupe:

SELECT u.* FROM groups_to_users gtu 
LEFT JOIN users u ON gtu.user_id=u.id 
WHERE gtu.group_id = :GroupId 
+0

Would le troisième groupe soit basé sur une clé étrangère ou entrée? – user3143218

+0

Chaque fois que vous avez une clé dans une autre table de votre table, c'est une clé étrangère. Ainsi, group_id et user_id sont tous deux des clés étrangères (c'est-à-dire des clés étrangères à "this" table). – Cully

+0

vous voulez dire les clés étrangères à l'ID de table de groupe et l'ID de liste d'utilisateurs? Il devrait remplir automatiquement lors de la création d'un groupe avec un identifiant d'utilisateur puis non? J'ai essayé et ça ne se met pas à jour. – user3143218