У меня есть таблица, содержащая этапы и подэтапы определенных проектов, и таблица с конкретными задачами и сметными затратами.
Мне нужен какой-то способ агрегирования каждого уровня (этапов / подэтапов), чтобы увидеть, сколькоэто стоит, но сделать это с минимальными затратами на производительность.
Чтобы проиллюстрировать это, я буду использовать следующую структуру данных:
CREATE TABLE stage
(
id int not null,
fk_parent int
)
CREATE TABLE task
(
id int not null,
fk_stage int not null,
cost decimal(18,2) not null default 0
)
со следующими данными:
==stage==
id fk_parent
1 null
2 1
3 1
==task==
id fk_stage cost
1 2 100
1 2 200
1 3 600
Я хочу получить таблицу с общими затратами по каждому филиалу.Примерно так:
Stage ID Total Cost
1 900
2 300
3 600
Но я тоже хочу, чтобы это было продуктивно.Я не хочу, чтобы в итоге получились крайне плохие решения, такие как Худший алгоритм в мире .Я имею в виду, что это так.В случае, если я буду запрашивать данные для всех элементов в таблице stage
, с общими затратами, каждая общая стоимость будет оценена D
раз, где D
- глубина в дереве (уровень), на которомон расположен.Боюсь, у меня будет очень низкая производительность при большом количестве данных с большим количеством уровней.
ТАК,
Я решил сделать что-то, что заставило меня задать этот вопрос здесь.
Я решил добавить еще 2 столбца в таблицу stage
для кэширования.
...
calculated_cost decimal(18,2),
date_calculated_cost datetime
...
Итак, я хотел передать другую переменную в коде, значение datetime
, равноевремя, когда этот процесс был запущен (в значительной степени уникальным).Таким образом, если в строке stage
уже есть date_calculated_cost
, равный тому, который я несу, я не буду рассчитывать его снова, а просто верну значение calculated_cost
.
Iне могу сделать это с помощью функций (необходимо обновить таблицу stage
, после расчета затрат)
Я не могу сделать это с помощью процедур (рекурсия внутри запущенных курсоров не нужна)
Яне уверен, что временные таблицы подходят, потому что они не разрешают одновременные запросы к одной и той же процедуре (что наименее вероятно, но в любом случае я хочу сделать это правильно)
Я не мог найти другие способы.
Я не ожидаю однозначного ответа на мой вопрос, но вознагражу любую хорошую идею, и в качестве ответа будет выбрана лучшая.