2015-12-06 3 views
1

Я пытаюсь использовать Neo4j для построения MDM. Я просто пытаюсь смоделировать нашу клиентскую базу данных с некоторыми свойствами, такими как электронная почта, номер документа, адрес, телефон, мобильный телефон и так далее.Использование Neo4j для создания главного управления данными

Проблема в том, что наша база данных слишком грязная. Например, у меня есть пользователи с таким же номером 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> 

Так я мог бы хранить график (с помощью "шифровать" язык)

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 

Второй подход

магазин котрой узлы со списком свойств, проведение хэшей. Эти хэши ссылается на запись в другой базе данных (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 хранятся в двух различных баз данных (техническое обслуживание)

(-) Необходимо поддерживать две отдельные базы данных

ответ

2

Обычно мы идем для первого подхода. Что-то вдоль линий

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 может обрабатывать множество узлов, поскольку у них очень мало места.

Запросы становятся немного более сложными, конечно.Но, с другой стороны, вы должны делать очистку/удаление дубликатов где-то, и это во время запроса гарантирует, что вы не потеряете исходную информацию. Это также дает вам гибкость для изменения/развития логики устранения дублирования или даже для разных вариантов использования.

Смежные вопросы