Дублирующие отношения против выполнения большего количества запросов - PullRequest
0 голосов
/ 25 июня 2018

У меня есть следующая архитектура.

enter image description here

Вы найдете дубликат в отношениях HAS. Основное значение находится между Badge и Skill, так как я хочу иметь возможность агрегировать / считать одинаковые Skill из разных Badge одного и того же User.

Итак, дублирующиеся отношения находятся между User и Skill. Это потому, что, например, если Organization хочет знать все навыки одного или нескольких получателей, я бы пошел по следующему пути:

 Org -OWNS-> Badges -IS_AWARDED_To-> User -HAS-> Skill
//Skill nodes for a specific or multiple user represent each skill contained in every Badge the user was awarded.

Однако, если я не добавлю дублирующиеся отношения HAS между User и Skill, я буду следовать по следующему пути:

Org -OWNS-> Badges -IS_AWARDED_TO-> User -IS_AWARDED-> Badges -HAS-> Skill
//Now I have all skills for a specific or multiple User for every badge awarded

Разница между этими двумя путями очевидна. Первый из них приведет к меньшему количеству запросов, но дублирование отношений вызывает беспокойство. Второй удалит проблему дублирования (это проблема?), Но будет иметь больше запросов. Я все еще новичок в neo4j и не стесняюсь сказать мне, что оба моих подхода кажутся запутанными, и есть более оптимизированный способ достичь того, что я пытаюсь сделать.

1 Ответ

0 голосов
/ 25 июня 2018

Ваши две модели действительны, и вы можете использовать обе.

Но, как вы сказали, на первой вы дублируете некоторые данные.Обычно мы делаем это, когда возникают проблемы с производительностью.Это ваш случай на данный момент?

В качестве отправной точки, Я рекомендую вам начать с модели 2 (т.е. без дублирования), и если у вас есть некоторые проблемы с этой моделью,Вы можете легко изменить его на модель 1 (гибкость Neo4j действительно хороша для рефакторинга графиков!).

В ИТ нет ничего бесплатного: если вы дублируете некоторые данные для лучшей производительности при чтении, вы будетевлияют на запись.

Когда вы пишете отношение (badge)-[:HAS]->(skill), вам также необходимо создать (user)-[:HAS]->(skill) rel (то же самое для обновления или удаления).

Поэтому вам нужно сохранитьсогласованность этих данных при обновлении графика.На самом деле это похоже на то, что вы создаете хранимое представление SQL.

...