Neo4j (или любая graph db) должен ли я моделировать каждую взаимосвязь, даже если взаимосвязь может быть определена с помощью graph

#database-design #neo4j #graph-modelling-language

#database-design #neo4j #язык графического моделирования

Вопрос:

Я только начал изучать Neo4J, чтобы отслеживать собственные приложения, использующие SQL Server, какие таблицы и столбцы используют эти приложения.

[Справочная информация] В настоящее время мы перестраиваем несколько наших монолитных приложений в приложения на основе микросервисов. Все эти монолиты используют общую базу данных, и эта база данных будет источником истины, пока этот процесс не будет завершен. Мы видим, что по мере роста этих усилий нам нужно будет отслеживать, какие приложения используют какие таблицы и, в частности, какие столбцы в этих таблицах.

Что нам нужно знать, так это это. «Если одному приложению необходимо изменить столбец в таблице, какие другие микросервисы необходимо оценить на предмет возможного негативного воздействия этих изменений?» (да) Я знаю, что «истинный» микросервис будет поддерживать свой собственный источник истины и ссылаться на другие сервисы для получения доступа к данным, не находящимся под их контролем. Этот проект предназначен для отслеживания этих данных в процессе преобразования. В принципе, в день 1 мы не будем волшебным образом включать несколько десятков сервисов со своими собственными источниками данных.

[Вопрос] Мой вопрос заключается в следующем.

У меня есть три типа узлов (таблица, столбец, приложение). Я сопоставил взаимосвязь между столбцом -> Таблица и из приложения — > Столбец, но должен ли я сопоставлять взаимосвязь из приложения — > Таблица, поскольку я могу перемещаться по графику, как это приложение -> Столбец -> Таблица

Посмотрите на диаграммы, чтобы получить представление о том, что я имею в виду.

Я включил код Cypher для создания графика.

Я знаю, что в общей схеме вещей я в основном спрашиваю о ТРЕХ (3) взаимосвязях (в моем примере), так зачем вообще беспокоиться, поскольку эти взаимосвязи незначительны по сравнению с количеством взаимосвязей столбцов (просто добавьте их уже).

Причина запроса больше связана с корректностью и изучением лучших практик.

Спасибо за отзыв.

введите описание изображения здесь

введите описание изображения здесь

Вот код шифрования, используемый для создания примерного графика

 CREATE (Customers:Table {Name:'Customers'})

CREATE (CustomerId:Column {Name:'CustomerId'})
CREATE (FirstName:Column {Name:'FirstName' })
CREATE (LastName:Column {Name:'LastName' })
CREATE (Address1:Column {Name:'Address1' })
CREATE (City:Column {Name:'City' })
CREATE (State:Column {Name:'State' })
CREATE (Cellphone:Column {Name:'Cellphone' })
CREATE (eMail:Column {Name:'eMail' })

CREATE (App_1:App {Name:'Call Back system'})
CREATE (App_2:App {Name:'Support'})
CREATE (App_3:App {Name:'Marketing'})


 
CREATE (CustomerId)-[:CONTAINED_IN]->(Customers)
CREATE (FirstName)-[:CONTAINED_IN]->(Customers)
CREATE (LastName)-[:CONTAINED_IN]->(Customers)
CREATE (Address1)-[:CONTAINED_IN]->(Customers)
CREATE (City)-[:CONTAINED_IN]->(Customers)
CREATE (State)-[:CONTAINED_IN]->(Customers)
CREATE (Cellphone)-[:CONTAINED_IN]->(Customers)
CREATE (eMail)-[:CONTAINED_IN]->(Customers)

//App 1
CREATE (App_1)-[:REFERENCES]->(Customers)
CREATE (App_1)-[:USES]->(CustomerId)
CREATE (App_1)-[:USES]->(FirstName)
CREATE (App_1)-[:USES]->(LastName)
CREATE (App_1)-[:USES]->(Cellphone)

//App 2
CREATE (App_2)-[:REFERENCES]->(Customers)
CREATE (App_2)-[:USES]->(CustomerId)
CREATE (App_2)-[:USES]->(FirstName)
CREATE (App_2)-[:USES]->(LastName)
CREATE (App_2)-[:USES]->(Address1)
CREATE (App_2)-[:USES]->(City)
CREATE (App_2)-[:USES]->(State)

 //App 3
CREATE (App_3)-[:REFERENCES]->(Customers)
CREATE (App_3)-[:USES]->(CustomerId)
CREATE (App_3)-[:USES]->(FirstName)
CREATE (App_3)-[:USES]->(LastName)
CREATE (App_3)-[:USES]->(eMail)
;  

Комментарии:

1.Я не эксперт, но мне понравилось использовать базы данных graph и особенно Neo4j. Я нахожу ценность в базах данных graph, выражая их как можно более «графичными». Обычно это упрощает последующие запросы и, вероятно, повышает эффективность. Например, глядя на вашу таблицу, я бы увидел гораздо больше типов связей. (:Customer) - [:HAS_XXXX] -> (:ManySpecificThings) :HAS_EMAIL , :HAS_CELLPHONE . И там тоже много информации о местоположениях и т.д.

2. Обычно я «разбиваю» таблицы на множество узлов и типов связей. Если я обнаруживаю, что некоторые узлы имеют много свойств, я обычно создаю несколько новых связей, и свойства получают свой собственный узел. Например, не достаточно ли только одного (:State {abbr: "IL"}) для всего графика?

Ответ №1:

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

В общем, следует избегать избыточности, и это не стоит дополнительных усилий по синхронизации связанных взаимосвязей и дополнительных требований к хранилищу.