Мне нужно пройти и обновить график в SQL.
Чтобы представить это в перспективе, я приведу пример:
- Каждая компания может представлять другую компанию по данному вопросу.
- Компании могут представлять друг друга, но не по одному и тому же предмету
Это предполагает такие таблицы, как:
companies(id)
, representations(source_id, destination_id, subject)
.
Но правило таково, что, когда моя компания больше не представляет вашу компанию по данному вопросу, никакие компании, расположенные ниже по цепочке от моей, не могут представлять мою компанию по тому же вопросу.
Надеюсь, вы понимаете, что я имею в виду.
Итак, с простыми данными, такими как:
C1:
--sell--> C2
--pay--> C3
C2:
--sell--> C3
--pay--> C1
C3:
--mail--> C1
--sell--> C4
C4:
--deliver-->C1
Теперь мы удаляем представление (мне следовало бы назвать его отношением) C2--sell-->C3
мы должны получить следующую структуру ([X]
- удалено):
C1:
--sell--> C2
--pay--> C3
C2:
[X]--sell--> C3
--pay--> C1
C3:
--mail--> C1
[X]--sell--> C4
C4:
--deliver-->C1
Итак, вопрос в том, как можно выбрать все компании, которые находятся ниже по цепочке от моей по заданной тематике?
Я полагаю, что рекурсивное выражение CTE - единственный способ сделать это.
ПРИМЕЧАНИЯ:
- Структура — это не дерево, это упорядоченный циклический граф.
- База данных Graph пока не вариант (это лишь небольшая часть системы)
- Обновления не обязательно должны быть немедленными, и вполне нормально, если они в конечном итоге будут согласованными (речь идет о нескольких секундах или минутах).