Использование Neo4j для построения управления основными данными
Я пытаюсь использовать Neo4j для создания MDM. Я просто пытаюсь смоделировать нашу базу данных клиентов с некоторыми свойствами, такими как электронная почта, номер документа, адрес, телефон, мобильный телефон и так далее.
Проблема в том, что наша база данных слишком грязная. Например, у меня есть пользователи с одинаковым documentNumber (это как ssn.). И когда я смотрю на эти реестры, я вижу, что на самом деле это один и тот же человек.
Для обнаружения паттерна через отношения мне нужно дедуплицировать / чистить записи. Но я боюсь потерять информацию, когда делаю записи.
Первый подход:
<customer>
<name>Maria da Silva</name>
<document>108518037-92</document>
<phone>
<areaCode>21</areaCode>
<number>2247223A<number>
<phone>
</customer>
<customer>
<name>Maria da S.</name>
<document>10851803792</document>
<phone>
<areaCode>21</areaCode>
<number>2247-2236<number>
<phone>
</customer>
Так что я мог бы сохранить график: (используя язык "cypher")
person1:Person {name:"Maria da Silva", document:"108518037-92"}
phone1:Phone {areaCode:"21", number:"2247223A"}
person1-[owns]->phone1
person2:Person {name:"Maria da S", document:"10851803792"}
phone2:Phone {areaCode:"21", number:"2247-2236"}
person2-[owns]->phone2
И тогда я мог бы создать нормализованные / очищенные узлы:
person_mdm:PersonMdm {name:"MARIA DA SILVA", document:"10851803792"} // now i have to choose a name
phone_mdm:PhoneMdm {areaCode:"21", number:"22472236"} // and choose a phone too
и затем свяжите исходные узлы с нормализованными узлами:
person_mdm-[references]->person1
person_mdm-[references]->person2
phone_mdm-[references]->phone1
phone_mdm-[references]->phone2
person_mdm-[owns]->phone_mdm
Второй подход
Сохраните узлы mdm со списком свойств, содержащих хэши. Эти хэши ссылаются на запись в другой базе данных (например, MongoDB):
person_mdm:PersonMdm {name:"MARIA DA SILVA", document:"10851803792", hash:[XXX, YYY]}
phone_mdm:PhoneMdm {areaCode:"21", number:"22472236", hash: [ZZZ, KKK]}
person_mdm-[owns]->phone_mdm
Первый подход:
(+) Его легко реализовать по сравнению со вторым подходом
(+) У меня будут все узлы в одной базе данных
(-) Количество узлов взрыва
(-) Запросы более сложные
Второй подход:
(+) Это простой и понятный запрос
(-) Информация MDM хранится в двух разных базах данных (обслуживание)
(-) Необходимо поддерживать две отдельные базы данных
1 ответ
Мы обычно идем на первый подход. Нечто подобное
person1:Person {name:"Maria da Silva", document:"108518037-92"}
phone1:Phone {areaCode:"21", number:"2247223A"}
person1-[:OWNS]->phone1
person2:Person {name:"Maria da S", document:"10851803792"}
phone2:Phone {areaCode:"21", number:"2247-2236"}
person2-[:OWNS]->phone2
person1-[:SAME_AS]->person2
Я не буду беспокоиться о количестве узлов, если у вас нет миллиардов. Neo4j может обрабатывать множество узлов, поскольку они занимают очень мало места.
Запросы становятся немного сложнее, конечно. Но, с другой стороны, вам нужно где-то выполнить очистку / дедупликацию, и выполнение этого во время запроса гарантирует, что вы не потеряете исходную информацию. Это также дает вам гибкость для изменения / развития логики дедупликации или даже для использования другой логики для каждого варианта использования.