2016-03-21 6 views
2

Unsere Firma hat viele Kundendaten basierend auf Umfragen. Zum Beispiel können wir wissen, dass jemand einen Sport, eine TV-Show, eine Band mag, schwanger ist und in einer Altersgruppe ist. Marketer fügen Kriterien hinzu, die verfolgt werden sollen. Graph-Datenbanken bieten eine Vielzahl von Optionen für die Modellierung beispiels wir so etwas wie Objektmodellierung tun könnenWie modelliere ich eine Kundenumfrage in einer Diagrammdatenbank?

Customer.survey_question1.question = "What tv show do you like" 
Customer.survey_question1.answer = "Sesame street" 

Hier möchten wir dem Kunden eine Eigenschaft mit einem Referenz geben Frage 1 zu überblicken, welche die Umfrage-Eigenschaften enthalten würde. Jedes Mal, wenn Vermarkter eine Frage und Antwort hinzufügen, müssen wir das Kundenschema aktualisieren.

Wir könnten es auch wie diese

Customer.surveys = [list of references to other objects] 

Modell, wo Umfragen ist eine Liste von Referenzen Objekte zu überblicken sie beantwortet haben.

Was die idiomatische Weise ist eine sehr spärliche Liste von Kunden Eigenschaften in einem GraphDB

Antwort

3

[EDITED ]

Hier ist eine idiomatische Möglichkeit, Ihren Anwendungsfall zu modellieren.

Sie könnten für jede Umfragefrage einen Knoten verwenden und allen Knoten die gleiche Bezeichnung geben, z. B. SurveyQuestion. Zum Beispiel:

(sq:SurveyQuestion {id: 222, question: "What tv show do you like?"}) 

Jeder Kunde, der eine SurveyQuestion beantwortet eine Beziehung eines bestimmten Typs haben könnte (etwa ANSWERED) auf diese Frage des Knotens, und diese Beziehung könnte die Person, die Antwort enthalten. Zum Beispiel:

(:Customer {id:123})-[:ANSWERED {answer: "The Voice"}]->(sq) 

Mit diesem Ansatz ist es nicht notwendig, einen Customer Knoten zu aktualisieren, wenn Sie eine neue Umfrage Frage hinzugefügt. Sie müssten nur dann eine ANSWERED-Beziehung erstellen, wenn ein Kunde tatsächlich eine Frage beantwortet.

alle Umfrage Fragen zu erhalten:

MATCH (sq:SurveyQuestion) 
RETURN sq; 

die Kunden zu erhalten, die jede Antwort auf eine Frage gegeben (dies ist Groß- und Kleinschreibung, so dass Sie alle Antworten LOWER mit Kleinbuchstaben wollen, bevor sie in ANSWERED Speicherung Beziehungen):

:

MATCH (sq:SurveyQuestion {id: 222})<-[a:ANSWERED]-(c:Customer) 
RETURN sq, a.answer AS answer, COLLECT(c); 

um alle Fragen, die ein Kunde beantwortet, und seine/ihre Antwort auf jeden zu bekommen

1

Von meinem expirience (etwa ~ 1 Jahr mit Neo4j) hinzuzufügen. Der größte Vorteil von Graph-Datenbanken als Datenspeicher besteht darin, komplexe Erkenntnisse aus ihren vorhandenen Daten zu generieren (wobei SQL-Datenbanken mit Join-Tabelle eine schwache Leistung aufweisen). Das Speichern aller Daten, die aus der Umfrage im Kundenknoten oder (: Kunde) - [: ANTWORTEN] -> (: Servey) abgerufen werden, bietet Ihnen keine Vorteile aus der neo4j-Datenbank. Aber du bekommst einige "dunkle Seiten" von neo4j :) Ich sage nicht, dass neo4j schlecht ist, aber heutzutage ist es nicht so poliert wie sql. Um also einen Vorteil von neo4j zu bekommen, würde ich versuchen, jede Benutzerantwort als separate Entität zu speichern, wenn es sinnvoll ist. Erstellen von Knoten wie: Sport,: TvShow. Aber Alter möchte ich gerne speichern: Kunde als Geburtsdatum. Oder Sie generieren eine Kalender-Struktur, wenn Sie sie auch in anderen Fällen verwenden möchten. So können Sie das Geburtsdatum als Beziehung zu bestimmten Knoten des Kalenderbaums speichern (: Tag oder: Monat oder Jahr e.t.c).

Ich würde Modell wie (c:Customer)-[r1:ANSWERS]->(s:Servey), (c)-[r2:WATCHES]->(tv:TvShow), (s)-[:SERVEY_REPLY]->(tv) verwenden. Wenn also der Kunde seine Meinung ändert und aufhört, Show s zu sehen, lösche ich die Beziehung r1, aber ich verliere keine Daten, da sie r2 gespeichert haben. Sie können zu dieser Modellbeziehung hinzufügen zu: Kalender und viele verschiedene Mitarbeiter, aber stellen Sie sicher, dass Sie es brauchen).

P.S. Soweit ich weiß, gibt es einige hochbezahlte Leute, um Datenbanken zu modellieren :) Als mein Rat, wenn Sie nicht sicher sind, dass Sie von graph-Datenbank profitieren, dann verwenden Sie es nicht auf Produktion :)

Verwandte Themen