Re[14]: Бизнес логика в ХП
От: Gattaka Россия  
Дата: 26.06.16 13:11
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, Gattaka, Вы писали:

G>>>Проблема в том, чтобы получить транзитивное замыкание? Тогда и процедура не сильно поможет. Лучше замыкание делать не в момент запроса, а строить заранее.
G>>Нет, я попробовал еще раз описать исходя из вопросов которые возникают: http://rsdn.ru/forum/design/6482289.1
Автор: Gattaka
Дата: 26.06.16

G>>Проблема в том, что данных дофига — 36 ГБ и проекция вам не поможет.

G>Проблема в том, что ты проблему не можешь объяснить, ты уже четвертый пост ходишь вокруг и даже запрос не привел и user flow объяснить не можешь нормально. У тебя есть только отмазка "данных много".

Ну раз так много человек плюсуют... Я вобще расчитывал что вы сами напишите этот запрос. Так было бы гораздо интереснее (тут без сарказма, действительно считаю что так было бы интереснее вам)
Вот запрос:


    -- 1. Простовляем списку узлов новую роль
        update Network_Node
    set Property = true -- Некий признак, флаг, роль и т.п. не вдаемся в подробности. Нам пока не важно.
    where Id in (select Id from @selectedNodes) --В хранимку приходит список идентификаторов выбранных пользователем узлов - табличная переменная @selectedNodes

    -- 2. В соответсвии с бизнес логикой нужно найти связать сетевые узлы, которым мы проставили роль по связям зарегестрированных на них пользователей 
    --    
    insert Node_Node(Node1Id, Node2Id)
    select distinct n.Id, un2.NodeId
    from Network_Node n
    join UserOnNode un1 on un1.NodeId = n.Id     -- Берем пользователей зарегестрированных на узле
        join User_User uu on uu.User1Id = un1.UserId -- Берем связи пользователя
        join UserOnNode un2 on un1.UserId = uu.User2Id -- Берем узлы на котором зарегестрирован связанный пользователь
    where n.Property = true 
          and not exists(select * from Node_Node nn3 where nn3.Node1Id = n.Id and nn3.Node2Id = un2.NodeId) -- такая связь еще не сущетвует


Итак, напомню

В таблице User(Id, Name) 70000 записей. В таблице Network_Node(Id, Name, Property) 70000 записей. В Таблице UserOnNode(NodeId, UserId) — 70000 записей по одному пользователю на узле. В таблице User_User(User1Id, User2Id) — связи пользователей, все польователи связаны со всеми — это 70000*70000=4900000000 записей. На каждую из записей по 8 байт, т.е. приблизительно 36 гигабайт табличка, не учитывая индексов. Теперь в таблице Network_Node(Node1Id, Node2Id) — связи узлов. Допустим кто-то с кем-то уже был связан в случайном порядке 900000000 записей каких-то.
Нам нужно сделать: У узлов (35000 каких-то) Network_Node меняется свойство Property — бизнес логика такова, что нужно найти зарегестрированные на этих узлах пользовати и если они связаны — добавить связи по узлам.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.