我必须管理一个类似gantt的界面,我们可以在其中拥有多个项目(project_id
)。并且需要获得完成项目的最短时间
我的表格如下:
任务
+---------+-------+----------------+
| id_task | name | days_allocated |
+---------+-------+----------------+
| 1 | task1 | 2 |
| 2 | task2 | 3 |
| 3 | task3 | 0.5 |
| 4 | task4 | 4 |
+---------+-------+----------------+
Task_predecessor (两个字段都链接到Task.id_task
)
+------+-------------+
| task | predecessor |
+------+-------------+
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 4 | 3 |
+------+-------------+
进度
+-------------+---------+------------+---------+
| id_progress | task_id | project_id | current |
+-------------+---------+------------+---------+
| 1 | 1 | 1 | 0 |
| 2 | 2 | 1 | 1 |
| 3 | 3 | 1 | 1 |
| 4 | 4 | 1 | 1 |
| 5 | 1 | 2 | 0 |
| 6 | 2 | 2 | 0 |
+-------------+---------+------------+---------+
因此任务表是我们的“模板”,我们会在进度表中跟踪优先级。
在这种情况下,对于project_id = 1
,id_task 1
已经完成(progress.current
为0
其中project_id = 1 AND task_id = 1
)
因此,任务id_task 2
+ id_task 4
或id_task 3
+ id_task 4
。
id_task 2
比id_task 3
花费的时间更长,所以关键路径是id_task 2 --> id_task 4
,7天
我有 2个选项:
我可以在任务表中添加minimal_days
列,因为我知道前辈。所以表格将是
+---------+-------+----------------+--------------+
| id_task | name | days_allocated | minimal_days |
+---------+-------+----------------+--------------+
| 1 | task1 | 2 | 9 |
| 2 | task2 | 3 | 7 |
| 3 | task3 | 0.5 | 4.5 |
| 4 | task4 | 4 | 4 |
+---------+-------+----------------+--------------+
我可以通过这种查询检索最小日期:
SELECT MAX(minimal_days) FROM progress
LEFT JOIN task ON task.id_task = progress.task_id
WHERE project_id = 1 AND current = 1
我在MySQL查询中重写了逻辑?但老实说,我不知道如何...
选项n°1可以轻松实现,结果几乎是即时的,但系统非常有限,如果添加或删除任务,则必须重新计算和更新所有days_allocated
。
在我看来,选项n°2在MySQL中最难编写。请求可能会更慢。特别是如果我们必须立即为多个项目检索它。一旦agin是一个沉淀......但系统将更加模块化。
我首先选择了2号选项,你呢?我应该先做另一种选择吗?还有其他方法可以继续吗?你能帮我在MySQL编写这个逻辑吗?
PS:我们一次可以使用50到100个项目。一个项目最多可以有30个任务,而task_predecessor是非常线性的。我们没有非常复杂的架构。所以我认为结果可以“实时”显示