Предполагая, что A, B & C и D, E, & F всегда будут принадлежать определенной группе в рамках цели, я бы разработал ее следующим образом:
Goal::isComplete()
{
foreach (Group)
{
switch (Group::type())
{
case "all":
TRUE if all complete
break
case "any":
TRUE if any complete
break;
}
}
if all TRUE
return TRUE
}
Или по-английски ...
Затем вы можете сохранить все свои действия в таблице действий и определить группу, частью которой они являются, в качестве простой ссылки на таблицу групп.Когда действие завершено, оно может быть помечено таким образом в БД.
Чтобы проверить достигнутые цели, вам просто нужно найти каждую группу, которая требуется для достижения цели.Каждая группа будет либо «все», либо «любая» (или другие подобные параметры, например, «min-2»), и это сообщит сценарию, что нужно проверять при выполнении заданий Activity.Каждая группа может затем возвратить ИСТИНА или ЛОЖЬ в зависимости от ее действий.Если предположить, что требуются все группы, то цель будет легко идентифицирована как выполненная или нет.
База данных может выглядеть следующим образом:
Activities
- id
- group_id
- name
- completed
- [details about activitiy]
Groups
- id
- goal_id
- type (ENUM: 'any', 'all')
- completed
- [details about group]
Goals
- id
- completed
- [details about goal]
Необходимые значения в группах и целях должны бытьактивно обновляться всякий раз, когда активность обновляется или пропускается, а их значения всегда динамически обрабатываются.
Имеет ли это смысл и делает то, что вам требуется?