Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 24, 2011 16:38:19

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с деревьями/графами

Нужно мне организовать из моделей структуру в виде сложного графа со связями. Причем каждая нода должна обладать кроме некоторого количества детей и родителей еще и разграничением прав на редактирование, для каждого пользователя свои права.

Я примерно представляю, как можно сделать права - можно создать параллельно с Node отдельную модель вроде NodeRights с полями can_add, can_modify, can_delete и внешним ключом на юзера, но как реализовать такую структуру с графом? Обычно такие вопросы решаются внешним ключом на себя, однако, и детей, и родителей может быть довольно много…

P.S, И да, циклы возможны, но между двумя нодами только одна связь



Отредактировано (Янв. 24, 2011 16:39:24)

Офлайн

#2 Янв. 24, 2011 17:38:29

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с деревьями/графами

Enchantner, если я правильно вас понял, то если у узла только одна связь — то и родитель у него только один.
NodeRights тогда:
node_id
user_id
permissions

Так же следует понимать и корректно удалять «детей» узла — пользователь может иметь право удалить узел, но, что если ему запретили удалять конкретного «ребёнка» этого узла? И тд. и тп.



Офлайн

#3 Янв. 24, 2011 17:42:35

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с деревьями/графами

maxwell
Я имел в виду, что между двумя конкретными нодами только одна связь :) а так - родителей и детей может быть много… Тут смысл не столько в иерархии, сколько в том, чтобы потом можно было создать несколько таких деревьев и смержить их в одно.

А нода будет в таком случае вести себя как переменная в C++. Пока у нее есть хоть одна связь - она будет существовать. Поэтому удаление ноды не подразумевает удаление соседних, а только удаление связей с соседними.

АПД: хотя, по логике, можно просто сделать связь отдельным объектом, как промежуточную таблицу, и хранить в нем пары внешних ключей на какие-либо две ноды. Тогда и мержить проще будет…



Отредактировано (Янв. 24, 2011 17:46:47)

Офлайн

#4 Янв. 24, 2011 17:46:25

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с деревьями/графами

Enchantner, Merge по каким критериям то будет вестись? По-моему это напрямую зависит от иерархии (читать: как мы этот самый граф создаем).



Офлайн

#5 Янв. 24, 2011 17:51:12

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с деревьями/графами

maxwell
Тут проблема в том, чтобы заресолвить права пользователей после объединения двух деревьев… А мержиться деревья будут по нодам, у которых совпадают какие-то параметры.

С нодами получается эдакий ManyToManyField на себя. Только суррогатный.

class TreeNodeLink(models.Model):
left = models.ForeignKey(TreeNode, related_name='left')
right = models.ForeignKey(TreeNode, related_name='right')



Отредактировано (Янв. 24, 2011 17:57:58)

Офлайн

#6 Янв. 24, 2011 23:33:15

OZION
От:
Зарегистрирован: 2008-10-15
Сообщения: 89
Репутация: +  0  -
Профиль   Отправить e-mail  

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version