2009-07-31 2 views
0

У меня сложилась такая ситуация. Мне нужно включить лиц внутри группы.
Для этого я создаю отношение, подобное изображенному на изображении.Сохранение группы лиц и каждое изменение в ней

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

Группа постоянно меняется (несколько раз в день, добавляют несколько людей и удалены из группы).
Мне нужно сохранить статус группы каждый раз, когда она изменяется (какие люди были в ней и между какими датами), для последующего анализа.

Для этого, каждый раз, когда Личность должна быть добавлена ​​или удалена из группы, мое приложение делает следующее:

  1. получить текущую группу (и лиц, находящихся в нем)
  2. создать список (в памяти) лиц в группе, за исключением или добавляющих те, в BEM удалены или добавлены
  3. обновляют EndDate на текущей группе
  4. создает новую группу
  5. вставки Лица (из списка в точке 2) в возвращении группы
  6. новый GroupID

Этот GroupID используется для сохранения журнала изменений в группе.

Пример данных, полученных после некоторых движений:

PERSON: 
PersonId Name 
1   John 
2   Sally 
3   Pete 

-Добавление Джон:

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

GROUPPERSON: 
GroupPersonId GroupId PersonId 
1    1   1 

-Добавление Салли:

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 

-Добавление Пит:

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 Джон:

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 

Это дизайн я придумал, но я единственный разработчик, я боюсь, я не вижу, это ясно.
Можете ли вы указать мне другие (лучшие) способы достижения тех же функций?

ответ

1

Мне не ясно, как вы знаете, что группа 2 является «той же» группой, что и группа 1 - или что информация не важна? Вот еще одно решение, предполагая, что группы продолжают существовать даже при добавлении новых членов (что кажется разумным!)

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

Добавление Джон:

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

Удаление Джона:

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

Так что к концу вашего примера у вас есть:

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 

Чтобы узнать членство группы 1 в определенные даты и время:

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

Чтобы узнать, какая группа является той, которую я хочу, я сохраняю текущий идентификатор группы в другом месте, поэтому перед созданием новой группы я проверяю, что такое текущее значение и его замените. Спасибо за Ваш ответ. –

1

Из неполной информации, которую вы, похоже, что вы должны держать Движения таблицы:

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} 

Обратите внимание, что вселенная может быть вычислена только из таблицы движений. (Конечно, по мере роста таблицы этот расчет становится более дорогостоящим, но я просто делаю основное предложение.)

+0

Спасибо за ваш ответ. Я добавил дополнительную информацию для объяснения моей реализации. –

Смежные вопросы