Существуют ли наборы лучших практик для подхода к моделированию данных в базе данных графов (сейчас я рассматриваю arangodb, но этот вопрос будет применяться к другим платформам)? Вот практический пример, иллюстрирующий мой вопрос:
Предположим, мы создаем централизованный список контактов для пользователей. У каждого пользователя есть контакты, но некоторые контакты могут быть общими для пользователей, например Джон знает Мэри, а Марк знает Мэри. Таким образом, у меня было бы 3 узла (Джон, Мэри и Марк), но Джон должен видеть только его отношения с Мэри, а не отношения Марка с Мэри.
Итак, как следует разработать полный граф, чтобы поддерживать доступ пользователей к своей информации?
Вариант 1. Создайте по одному графику для каждого пользователя. Таким образом, я точно знаю, кто что может видеть (я мог бы, например, поставить перед всеми своими коллекциями префикс идентификатора пользователя). Это было бы просто, но дублировало бы много данных (например, если бы я поместил всю свою семью в базу данных, мой брат тоже сделал бы это, создав дважды одни и те же данные на разных графиках)
Вариант 2: Создайте 1 общий граф с узлами контактов и узлами пользователей. Я бы подключил контакт Джона, Мэри и Марка, но узел «Пользователь», представляющий Джона, был бы связан только с узлами «Контакт», Джон и Мэри. Таким образом, я мог бы получить только те контактные узлы, которые подключены к узлу User, на котором я сосредоточен. Проблема в том, что ребра не могут быть связаны с узлом пользователя (у меня не может быть ребра, идущего от узла к ребру ... можно?). Поэтому мне пришлось бы добавить атрибут user_id ко всем краям, чтобы получить только те, которые относятся к текущему пользователю. Это немного приятнее, поскольку мне не нужно дублировать узлы, но мне все равно придется дублировать края, поскольку они будут специфичными для пользователя.
Вариант 3: Сделайте это SQL, как с таблицей прав, поддерживая список идентификаторов контактов вместе с тем, какой пользователь может видеть, какой узел и какой край (тяжелые соединения)
Варианты 4: ???
Как и во всем, есть много способов найти решение, но мне было интересно, что считается лучшей практикой для баланса чистоты подхода и производительности для вставки / удаления ... зная, что производительность может зависеть от платформы