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参照として定義できます。アクティビティが完了すると、DBでこのようにマークを付けることができます。
完了した目標を確認するには、目標に必要な各グループを探すだけです。各グループは「all」または「any」(または「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]
グループと目標内の完了値は、アクティビティが更新されるたびにアクティブに更新されるか、省略され、それらの値が常に動的に処理される必要があります。
これは理にかなっていて、あなたが必要としていることをしますか?