假设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
}
或者用英语...
然后,您可以将所有活动存储在活动表中,并将它们所属的组定义为对组表的简单 id 引用。当一个活动完成时,它可以在数据库中被标记。
要检查已完成的目标,您只需查找目标所需的每个组。每个组可以是“全部”或“任何”(或其他类似选项,如“min-2”),这将告诉脚本要检查活动完成的内容。然后每个组可以根据其活动返回 TRUE 或 FALSE。假设所有组都是必需的,那么目标很容易被识别为完成与否。
数据库可能如下所示:
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]
每当更新或忽略活动时,需要主动更新组和目标中的已完成值,并且它们的值总是动态计算出来的。
这是否有意义并满足您的要求?