Wie entwerfe ich ein solches Schema in MongoDB? Ich denke, es gibt keine Fremdschlüssel!
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.
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.
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
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.
Der dokumenttypisierte Charakter von MongoDB unterstützt flexible Möglichkeiten zum Definieren von Beziehungen. So definieren Sie eine Eins-zu-Viele-Beziehung:
Beispiel:
student
{
name: 'Kate Monster',
addresses : [
{ street: '123 Sesame St', city: 'Anytown', cc: 'USA' },
{ street: '123 Avenue Q', city: 'New York', cc: 'USA' }
]
}
Wie im obigen Beispiel student
/course
.
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: