2016-06-21 8 views
2

Ich versuche NoSQL und während der Erkundung kann ich nicht in den Kopf, wie man mit Referenzdaten umgehen. (Ich bin an die traditionelle Datenbank gewöhnt, die tabellarische) Sagen Sie, ich habe eine Schuleinheit mit Schülern und Anforderungen. Jetzt kann der Student an einer Schule eingeschrieben werden und kann die Anforderungen später erfüllen. Also würde die Schule nach einem Schüler suchen und prüfen, welche Anforderungen er erfüllt hat.Denken NoSQL auf Referenzdaten

Auf traditionelle Datenbank würde ich etwas wie tun.

+---------+ +---------------+ +--------------------+ +---------+ 
| School | | Requirement | | StudentRequirement | | Student | 
+---------+ +---------------+ +--------------------+ +---------+ 
| Id (PK) | | Id (PK)  | | Id (PK)   | | Id (PK) | 
| Name | | Name   | | StudentId (FK)  | | Name | 
+---------+ | SchoolId (FK) | | RequirementId (FK) | +---------+ 
      +---------------+ | HasComply   | 
           +--------------------+ 

würde ich 4 Entities erstellen, und die Requirement hat eine viele-zu-viele-Beziehung zu einem Student. Also, ob ich eine Requirement editiere oder entferne, kann ich nur auf die Zwischentabelle schauen.

Eine Strömung so etwas wie:

// EnrollStudentToASchool 
// AssignAllRequirementsToNewStudent 

Dann irgendwo in meinem Code, wenn eine neue Anforderung

// IfNewRequirement 
// AddNewRequirementToStudent 

Jetzt erstellt wurde, in NoSQL und in meinem Fall habe ich mongodb bin mit einem doc type Datenspeicher Ich habe irgendwo gelesen, dass Daten inline sein sollten. Etwas wie:

{ 
    Id: 1, 
    School: 'Top1 Foo School', 
    Requirements: 
    [ 
    { Id: 1, Name: 'Req1' }, 
    { Id: 2, Name: 'Req2' } 
    ], 
    Students: 
    [ 
    { 
     Id: 1, 
     Name: 'Student1', 
     Requirements: 
     [ 
     { Id: 1, Name: 'Req1', HasComply: false }, 
     { Id: 2, Name: 'Req2', HasComply: true }, 
     ] 
    } 
    ] 
}, 
{ 
    Id: 2, 
    School: 'Top1 Bar School', 
    Requirements: [], 
    Students: [] 
} 

Die Wurzel meines Dokuments wird die School, gleiche Strömungs oben:

// EnrollStudentToASchool 
// AssignAllRequirementsToNewStudent 
// IfNewRequirement 
// AddNewRequirementToStudent 

Aber im Falle von, sagen wir, die Schule den Namen des Requirement zu bearbeiten beschlossen oder entfernen a Requirement.

Wie soll es gemacht werden? Sollte ich alle meine Schüler wiederholen und die Anforderungen bearbeiten/entfernen? Oder vielleicht mache ich alles falsch.

Bitte beraten.

Antwort

1

Dies ist ein netter Anwendungsfall.

Ihr Beispiel zeigt die meisten relevanten Vor- und Nachteile bei der Konvertierung von SQL zu NOSQL.

Sie bitte zuerst vorgeschlagene Sammlung Design sehen: collection

Wir haben zwei Sammlungen: school und student warum das? Wir müssen über die Größenbeschränkung des bson-Dokuments nachdenken (16MB), und wenn wir eine gute Schule haben, könnte die Anzahl der Schüler diese Größe überschreiten.

Warum also wir Daten in jeder Schülerakte duplizieren? Wenn wir die Details der Schüler haben wollen, brauchen wir nicht zur Schule zu gehen (keine extra Hin- und Rückfahrt).

Wir haben eine Reihe von Anforderungen in der Schule zu erfüllen (eine Art Master), und dann hat jeder Schüler seine eigene Array mit Ergebnis.

Das Hinzufügen/Entfernen solcher Daten erfordert Iteration über alle Schüler und Schulen.

Also in einfachen Worten - keine Join bei täglichen Display-Operationen => Effizienz, aber Update erzeugt ein bisschen mehr Last gegen SQL.

Alle Kommentare willkommen!

+0

Lassen Sie mich wissen, wenn ich Sie richtig verstehe. Du hast 2 Kollektionen erstellt, nämlich 'school' und' student'. Du hast den Schülern die Schuldetails irgendwie eingegliedert, also keine extra Rundreise. Jetzt, wenn eine Anforderung von einer Schule hinzugefügt/aktualisiert/entfernt wurde, müssen alle Schüler- und Schulaufzeichnungen wiederholt werden. Richtig? By the way, vielen Dank für die Mühe, die visuelle Beziehung –

+0

@BoyPasmo ja das ist richtig! Bitte schön! – profesor79

+0

Auch ich merke auf der visuellen Darstellung, dass Sie die "Anforderungen" an "Student" eingebettet haben. Ist es keine extra Hin- und Rückfahrt? Wenn Sie dies in einer C# -Klasse darstellen würden. 'öffentliche Klasse Student {public int Id {get; einstellen; } öffentliche Zeichenkette Name {get; einstellen; } public string Schulname {get; einstellen; } public ICollection Anforderungen {get; einstellen; }} 'Ist das nicht ein Design-Geruch? Oder gibt es vorher eine Art Konfiguration oder Mapping? –