2009-07-31 5 views
0

J'ai cette situation si j'ai besoin d'inclure des Personnes dans un Groupe.
Pour cela, je crée une relation comme celle montrée dans l'image.Enregistrement d'un groupe de personnes et de toutes les modifications

table diagram http://img189.imageshack.us/img189/6076/imagetkr.png

Les groupes sont en constante évolution (plusieurs fois par jour, plusieurs personnes sont ajoutés et supprimés d'un groupe).
J'ai besoin de sauvegarder le statut du groupe chaque fois qu'il change (quelles personnes étaient dedans et entre quelles dates), pour une analyse ultérieure.

Pour cela, chaque fois qu'une personne doit être ajouté ou supprimé d'un groupe, mon application effectue les opérations suivantes:

  1. obtenir le groupe actuel (et les personnes à l'intérieur)
  2. créer une liste (en mémoire) des personnes du groupe, à l'exclusion ou en ajoutant ceux à bem enlevé ou ajouté
  3. mise à jour du EndDate sur le groupe actuel
  4. crée un nouveau groupe
  5. insérer les personnes (de la liste au point 2) dans le groupe
  6. retour la nouvelle GroupId

Ce GroupId est utilisé pour enregistrer un journal des changements dans le groupe.

Un exemple des données générées après quelques mouvements:

PERSON: 
PersonId Name 
1   John 
2   Sally 
3   Pete 

-Ajout John:

GROUP: 
GroupId Description StartDate   EndDate 
1  John added 31/7/2009 11:00:00 null 

GROUPPERSON: 
GroupPersonId GroupId PersonId 
1    1   1 

-Ajout Sally:

GROUP: 
GroupId Description StartDate   EndDate 
1  John added 31/7/2009 11:00:00 31/7/2009 11:35:00 
2  Sally added 31/7/2009 11:35:00 null 

GROUPPERSON: 
GroupPersonId GroupId PersonId 
1    1   1 
2    2   1 
3    2   2 

-Ajout Pete:

GROUP: 
GroupId Description StartDate   EndDate 
1  John added 31/7/2009 11:00:00 31/7/2009 11:35:00 
2  Sally added 31/7/2009 11:35:00 31/7/2009 12:10:00 
3  Pete added 31/7/2009 12:10:00 null 

GROUPPERSON: 
GroupPersonId GroupId PersonId 
1    1   1 
2    2   1 
3    2   2 
4    3   1 
5    3   2 
6    3   3 

-Retirez John:

GROUP: 
GroupId Description StartDate   EndDate 
1  John added 31/7/2009 11:00:00 31/7/2009 11:35:00 
2  Sally added 31/7/2009 11:35:00 31/7/2009 12:10:00 
3  Pete added 31/7/2009 12:10:00 31/7/2009 12:24:00 
4  John removed 31/7/2009 12:24:00 null 

GROUPPERSON: 
GroupPersonId GroupId PersonId 
1    1   1 
2    2   1 
3    2   2 
4    3   1 
5    3   2 
6    3   3 
7    4   2 
8    4   3 

C'est la conception que je suis venu avec, mais comme je suis un développeur, je crains que je ne vois pas clairement.
Pouvez-vous me signaler d'autres (meilleures) façons d'obtenir les mêmes caractéristiques?

Répondre

1

Je ne sais pas comment vous savez que le groupe 2 est le "même" groupe que le groupe 1 - ou Cette information n'est-elle pas importante? Voici une autre solution, en supposant que les groupes continuent d'exister même lorsque de nouveaux membres sont ajoutés (ce qui semble raisonnable!)

create table groups (groupId integer primary key); 
create table persons (personId integer primary key) 
create table group_member (groupId references groups, 
          personId references persons, 
          startDate date, 
          endDate date); 

Ajout John:

insert into group_members (groupId, personId, startDate) 
values (1, 1, '1/7/2009 11:00:00'); 

Retrait John:

update group_members 
set endDate = '31/7/2009 12:24:00' 
where groupId = 1 and personId = 1; 

Alors à la fin de votre exemple, vous avez:

PERSON: 
PersonId Name 
1   John 
2   Sally 
3   Pete 

GROUP 
groupId 
1 

GROUP_MEMBERS: 
groupId personId startDate   endDate 
1  1  1/7/2009 11:00:00 31/7/2009 12:24:00 
1  2  31/7/2009 11:35:00 
1  3  31/7/2009 12:10:00 

Pour connaître les membres du groupe 1 à une date et une heure données:

select personId 
from group_members 
where groupId = 1 
and startDate <= :given_datetime 
and (endDate is null or endDate >= :given_datetime); 
+0

Pour savoir quel groupe est celui que je veux, je sauvegarde l'identifiant du groupe actuel dans un autre emplacement, donc avant de créer le nouveau groupe, je vérifie quel est le courant et le remplace. Merci pour votre réponse. –

1

D'après les informations incomplètes que vous fournissez, il semble que vous devez garder une table Mouvements:

Date/Time   Group  Action Person // The Universe 

17/7/2009 10:01:00 Group A Enter  John  // {A: John} 
17/7/2009 10:02:00 Group A Enter  Sally  // {A: John, Sally} 
17/7/2009 11:22:23 Group B Enter  Pete  // {A: John, Sally}, {B: Pete} 
17/7/2009 11:34:45 Group A Exit  John  // {A: Sally}, {B: Pete} 

Notez que l'univers peut être calculé juste de la table mouvements. (Bien sûr, à mesure que la table grossit, ce calcul devient plus coûteux, mais je fais simplement une suggestion de base.)

+0

Merci pour votre réponse. J'ai ajouté quelques informations supplémentaires pour expliquer ma mise en œuvre. –

Questions connexes