webentwicklung-frage-antwort-db.com.de

Fremdschlüssel im Mongo?

enter image description here

Wie entwerfe ich ein solches Schema in MongoDB? Ich denke, es gibt keine Fremdschlüssel!

78
Mark Pegasov

Möglicherweise möchten Sie ein ORM wie Mongoid oder MongoMapper verwenden.

http://mongoid.org/docs/relations/referenced/1-n.html

In einer NoSQL-Datenbank wie MongoDB gibt es keine 'Tabellen', sondern Dokumente. Dokumente werden in Sammlungen gruppiert. Sie können jede Art von Dokument - mit jeder Art von Daten - in einer einzigen Sammlung haben. Grundsätzlich müssen Sie in einer NoSQL-Datenbank entscheiden, wie die Daten und gegebenenfalls ihre Beziehungen organisiert werden sollen.

Was Mongoid und MongoMapper tun, ist, Ihnen bequeme Methoden zum Einrichten von Beziehungen zur Verfügung zu stellen. Schauen Sie sich den Link an, den ich Ihnen gegeben habe, und fragen Sie nach etwas.

Bearbeiten:

In Mongoid schreiben Sie Ihr Schema wie folgt:

class Student
  include Mongoid::Document

    field :name
    embeds_many :addresses
    embeds_many :scores    
end

class Address
  include Mongoid::Document

    field :address
    field :city
    field :state
    field :postalCode
    embedded_in :student
end

class Score
  include Mongoid::Document

    belongs_to :course
    field :grade, type: Float
    embedded_in :student
end


class Course
  include Mongoid::Document

  field :name
  has_many :scores  
end

Bearbeiten:

> db.foo.insert({group:"phones"})
> db.foo.find()                  
{ "_id" : ObjectId("4df6539ae90592692ccc9940"), "group" : "phones" }
{ "_id" : ObjectId("4df6540fe90592692ccc9941"), "group" : "phones" }
>db.foo.find({'_id':ObjectId("4df6539ae90592692ccc9940")}) 
{ "_id" : ObjectId("4df6539ae90592692ccc9940"), "group" : "phones" }

Sie können diese ObjectId verwenden, um Beziehungen zwischen Dokumenten herzustellen.

23
Nerian

Wie gestalte ich einen Tisch wie diesen in Mongodb?

Erstens, um einige Namenskonventionen zu klären. MongoDB verwendet collections anstelle von tables.

Ich denke, es gibt keine Fremdschlüssel!

Nehmen Sie das folgende Modell:

student
{ 
  _id: ObjectId(...),
  name: 'Jane',
  courses: [
    { course: 'bio101', mark: 85 },
    { course: 'chem101', mark: 89 }
  ]
}

course
{
  _id: 'bio101',
  name: 'Biology 101',
  description: 'Introduction to biology'
}

Die Kursliste von Jane weist eindeutig auf bestimmte Kurse hin. Die Datenbank wendet keine Einschränkungen auf das System an (, d. H .: Fremdschlüsseleinschränkungen ), daher gibt es keine "kaskadierenden Löschungen" oder "kaskadierenden Aktualisierungen". Die Datenbank enthält jedoch die richtigen Informationen.

Darüber hinaus verfügt MongoDB über einen DBRef-Standard , mit dessen Hilfe die Erstellung dieser Referenzen standardisiert werden kann. In der Tat, wenn Sie sich diesen Link ansehen, hat er ein ähnliches Beispiel.

Wie kann ich diese Aufgabe lösen?

Um klar zu sein, ist MongoDB nicht relational. Es gibt keine Standard "Normalform". Sie sollten Ihre Datenbank entsprechend den von Ihnen gespeicherten Daten und den Abfragen, die Sie ausführen möchten, modellieren.

59
Gates VP

Aus Das kleine MongoDB-Buch

Eine weitere Alternative zur Verwendung von Joins ist die Denormalisierung Ihrer Daten. In der Vergangenheit war die Denormalisierung für leistungsabhängigen Code reserviert, oder wenn Daten (wie in einem Überwachungsprotokoll) erfasst werden sollten. Mit der stetig wachsenden Popularität von NoSQL, von denen viele keine Joins haben, wird die Denormalisierung als Teil der normalen Modellierung immer häufiger. Dies bedeutet nicht, dass Sie jede Information in jedes Dokument kopieren sollten. Anstatt jedoch zu befürchten, dass doppelte Daten Ihre Entwurfsentscheidungen beeinflussen, sollten Sie Ihre Daten anhand der Informationen modellieren, die zu welchem ​​Dokument gehören.

So,

student
{ 
    _id: ObjectId(...),
    name: 'Jane',
    courses: [
    { 
        name: 'Biology 101', 
        mark: 85, 
        id:bio101 
    },
  ]
}

Wenn es sich um RESTful-API-Daten handelt, ersetzen Sie die Kurs-ID durch einen GET-Link zur Kursressource

15
ZAky

In MongoDB können wir den sogenannten foreign key Definieren. Wir müssen jedoch die Datenintegrität aufrechterhalten VON UNSELBEN. Beispielsweise,

student
{ 
  _id: ObjectId(...),
  name: 'Jane',
  courses: ['bio101', 'bio102']   // <= ids of the courses
}

course
{
  _id: 'bio101',
  name: 'Biology 101',
  description: 'Introduction to biology'
}

Das courses Feld enthält _id Kurse. Es ist einfach, eine Eins-zu-Viele-Beziehung zu definieren. Wenn wir jedoch die Kursnamen des Schülers Jane abrufen möchten, müssen wir eine andere Operation ausführen, um das Dokument course über _id Abzurufen.

Wenn der Kurs bio101 Entfernt wird, müssen wir eine weitere Operation ausführen, um das Feld courses im Dokument student zu aktualisieren.

Mehr: MongoDB Schema Design

Der dokumenttypisierte Charakter von MongoDB unterstützt flexible Möglichkeiten zum Definieren von Beziehungen. So definieren Sie eine Eins-zu-Viele-Beziehung:

Eingebettetes Dokument

  1. Geeignet für ein bis wenige.
  2. Vorteil: Es müssen keine zusätzlichen Abfragen zu einem anderen Dokument durchgeführt werden.
  3. Nachteil: Die Entität eingebetteter Dokumente kann nicht einzeln verwaltet werden.

Beispiel:

student
{
  name: 'Kate Monster',
  addresses : [
     { street: '123 Sesame St', city: 'Anytown', cc: 'USA' },
     { street: '123 Avenue Q', city: 'New York', cc: 'USA' }
  ]
}

Referenzierung von Kindern

Wie im obigen Beispiel student/course.

Übergeordnete Referenzierung

Geeignet für One-to-Squillions, z. B. Protokollnachrichten.

Host
{
    _id : ObjectID('AAAB'),
    name : 'goofy.example.com',
    ipaddr : '127.66.66.66'
}

logmsg
{
    time : ISODate("2014-03-28T09:42:41.382Z"),
    message : 'cpu is on fire!',
    Host: ObjectID('AAAB')       // Reference to the Host document
}

Praktisch ist ein Host das übergeordnete Element eines logmsg. Wenn Sie auf die Host -ID verweisen, wird viel Platz gespart, da die Protokollnachrichten Millionen Mal sind.

Verweise:

  1. 6 Faustregeln für MongoDB Schema Design: Teil 1
  2. 6 Faustregeln für MongoDB Schema Design: Teil 2
  3. 6 Faustregeln für MongoDB Schema Design: Teil
  4. Modellieren Sie Eins-zu-Viele-Beziehungen mit Dokumentenreferenzen
13
Joy