2009-07-31 12 views
0

Ich habe diese Situation, in der ich Personen innerhalb einer Gruppe einschließen musste.
Dafür erzeuge ich eine Beziehung wie die im Bild gezeigt.Gruppe von Personen speichern und jede Änderung darin

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

Die Gruppen ändern sich ständig (mehrmals täglich werden mehrere Personen hinzugefügt und aus einer Gruppe entfernt).
Ich muss den Status der Gruppe jedes Mal speichern, wenn es sich ändert (welche Personen waren darin und zwischen welchen Daten), für die spätere Analyse.

Dafür jedes Mal eine Person aus einer Gruppe hinzugefügt oder entfernt wurde, kommt die Anwendung des folgenden:

  1. die aktuelle Gruppe erhalten (und die Personen darin)
  2. eine Liste erstellen (im Speicher) von Personen in der Gruppe, mit Ausnahme von oder Hinzufügen diejenigen zu bem entfernt oder
  3. Aktualisierung der EndDate auf der aktuellen Gruppe
  4. erzeugt eine neue Gruppe
  5. einzufügen, die Personen (aus der Liste in Punkt hinzugefügt 2) in der Gruppe
  6. Rückkehr die neue GroupId

Diese GroupId wird verwendet, um ein Protokoll der Änderungen in der Gruppe zu speichern.

Ein Beispiel für die nach einigen Bewegungen erzeugten Daten:

PERSON: 
PersonId Name 
1   John 
2   Sally 
3   Pete 

-Hinzufügen John:

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

GROUPPERSON: 
GroupPersonId GroupId PersonId 
1    1   1 

-Hinzufügen 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 

-Hinzufügen 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 

-Remove 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 

Dieses ist der Entwurf kam ich mit, aber wie ich bin ein einzelner Entwickler Ich fürchte, ich sehe es nicht klar.
Können Sie mir andere (bessere) Wege zeigen, die gleichen Funktionen zu erreichen?

Antwort

1

Es ist mir nicht klar, wie Sie wissen, dass Gruppe 2 die "gleiche" Gruppe wie Gruppe 1 - oder ist Ist diese Information nicht wichtig? Hier ist eine andere Lösung, unter der Annahme, dass Gruppen auch dann bestehen bleiben, wenn neue Mitglieder hinzugefügt werden (was vernünftig erscheint!).

)
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); 

John hinzu:

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

John Entfernen:

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

bis Ende Ihr Beispiel Sie haben also:

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 

die Mitgliedschaft Um herauszufinden, der Gruppe 1 zu einem bestimmten Zeitpunkt:

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

Um zu wissen, welche Gruppe ich möchte, speichere ich die aktuelle Gruppen-ID an einem anderen Ort. Bevor ich die neue Gruppe erstelle, überprüfe ich, was die aktuelle Gruppe ist und ersetze sie. Danke für deine Antwort. –

1

aus den unvollständigen Informationen, die Sie, es sieht aus wie Sie eine Tabelle Bewegungen halten sollen:

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} 

Beachten Sie, dass das Universum aus den Bewegungen Tabelle nur berechnet werden kann. (Natürlich, während die Tabelle wächst, wird diese Berechnung teurer, aber ich mache nur einen grundlegenden Vorschlag.)

+0

Danke für Ihre Antwort. Ich habe weitere Informationen hinzugefügt, um meine Implementierung zu erläutern. –

Verwandte Themen