SQL - процедура нахождения путей в графе

Обновлено 13.09.09:

Есть таблица, определяющая взвешенный ориентированный граф, описана так

create table Connection (

con_id bigint not null,

con_type tinyint not null default 1, --тип соединения,

--возможные значения: 1,2,4,8 bin: 0001,0010,0100,1000

con_from bigint not null,--конечная вершина

con_to bigint not null,--начальная вершина

con_cost decimal not null,--стоимость соединения (вес)

con_time datetime not null, --время прохождения соединения (второй вариант веса)

constraint PK_CONNECTION primary key (con_id)

)

требуется написать процедуру, которая по заданным параметрам возвращает все возможные пути, соответствующие заданным параметрам.

Процедура:

create procedure dbo.sp_get_paths

@dst_from_id bigint,--начальная точка пути

@dst_via_ids nvarchar(2048) null, --строка, содержащая id пунктов, через которые должен пройти путь через запятую, в том порядке, как они указаны, т.о. путь должен начинаться с dst_from_id, проходить через некоторые пункты, в том числе через dst_via_ids в указанном порядке

@dst_to_id bigint,--конечная точка маршрута

@allowed_type int,--разрешенные типы соединений, которые можно использовать (маска)

@weight_is_cost bit, --если TRUE то в качестве веса соединения используется поле cost, в противном случае time

@max_path_length tinyint, --максимальное количество пунктов в пути

@max_path_count tinyint, --максимальное количество путей в результате

@max_path_cost decimal null,--максимальная суммарная стоимость пути (если задано)

@max_path_time datetime null, --максимальное суммарное время пути (если задано)

as

declare

begin

?

end

Возращает процедура таблицу с найденными путями, отсортированную по возрастанию суммарной стоимости(или суммарного времени),

в столбцах таблицы - пути, в рядах описание путя: - id соединений (con_id), предпоследние 3 ряда содержат суммарный вес пути: 2 ряда на суммарную стоимость (в первом ряду целая часть, во втором дробная), и последний ряд содержит общее время на путь, в минутах.

Все значения - bigint

пример:

path1 | path2 | path3

12 | 11 | 1

35 | 3 | 89

14 |18 | null

15 | null | null

34 |45 | 87 - стоимости 34.5,45.3,87.2

50 |30 | 20

85 |1405 |741 - длительности 01:25:00,23:25:00,12:21:00

максимально в таблице может быть @max_path_count столбцов и @max_path_length+3 рядов.

Если ничего не найдено возвращается таблица

path1

0

Если произошла ошибка, то нужно кидать пользовательское исключение с описанием и кодом ошибки.

Целевая БД - MSSQL 2005

Процедура должна быть максимально оптимизирована.

Допускается изменение описания таблицы с графами и входных параметров процедуры для оптимизации, но только при условии согласования со мной.

Предполагается, что базе будет(максимально) порядка 10^9 записей (в таблице Connection)

и где-то 10^4 в таблице Destination

Заявки фрилансеров