MySQL:获取关键路径时间

时间:2017-08-03 12:40:44

标签: mysql

我必须管理一个类似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 = 1id_task 1已经完成(progress.current0其中project_id = 1 AND task_id = 1

因此,任务id_task 2 + id_task 4id_task 3 + id_task 4

id_task 2id_task 3花费的时间更长,所以关键路径是id_task 2 --> id_task 4,7天

我有 2个选项

选项n°1

我可以在任务表中添加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

选项n°2

我在MySQL查询中重写了逻辑?但老实说,我不知道如何...

选项n°1可以轻松实现,结果几乎是即时的,但系统非常有限,如果添加或删除任务,则必须重新计算和更新所有days_allocated

在我看来,选项n°2在MySQL中最难编写。请求可能会更慢。特别是如果我们必须立即为多个项目检索它。一旦agin是一个沉淀......但系统将更加模块化。

我首先选择了2号选项,你呢?我应该先做另一种选择吗?还有其他方法可以继续吗?你能帮我在MySQL编写这个逻辑吗?

PS:我们一次可以使用50到100个项目。一个项目最多可以有30个任务,而task_predecessor是非常线性的。我们没有非常复杂的架构。所以我认为结果可以“实时”显示

0 个答案:

没有答案