Bagaimana cara mendesain skema seperti ini di MongoDB? Saya pikir tidak ada kunci asing!
Bagaimana cara mendesain skema seperti ini di MongoDB? Saya pikir tidak ada kunci asing!
Jawaban:
Anda mungkin tertarik menggunakan ORM seperti Mongoid atau MongoMapper.
http://mongoid.org/docs/relations/referenced/1-n.html
Dalam database NoSQL seperti MongoDB tidak ada 'tabel' tetapi koleksi. Dokumen dikelompokkan di dalam Koleksi. Anda dapat memiliki jenis dokumen apa pun - dengan jenis data apa pun - dalam satu koleksi. Pada dasarnya, dalam database NoSQL, terserah Anda untuk memutuskan bagaimana mengatur data dan hubungannya, jika ada.
Apa yang dilakukan Mongoid dan MongoMapper adalah memberi Anda metode yang nyaman untuk mengatur hubungan dengan mudah. Lihat tautan yang saya berikan kepada Anda dan tanyakan apa saja.
Edit:
Di mongoid Anda akan menulis skema Anda seperti ini:
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
Edit:
> 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" }
Anda dapat menggunakan ObjectId itu untuk melakukan hubungan antar dokumen.
Bagaimana cara mendesain meja seperti ini di mongodb?
Pertama, untuk memperjelas beberapa konvensi penamaan. MongoDB menggunakan collections
bukan tables
.
Saya pikir tidak ada kunci asing!
Ambil model berikut:
student
{
_id: ObjectId(...),
name: 'Jane',
courses: [
{ course: 'bio101', mark: 85 },
{ course: 'chem101', mark: 89 }
]
}
course
{
_id: 'bio101',
name: 'Biology 101',
description: 'Introduction to biology'
}
Jelas daftar kursus Jane menunjuk ke beberapa kursus tertentu. Basis data tidak menerapkan batasan apa pun ke sistem ( yaitu: batasan kunci asing ), jadi tidak ada "penghapusan berjenjang" atau "pembaruan bertingkat". Namun, database memang berisi informasi yang benar.
Selain itu, MongoDB memiliki standar DBRef yang membantu menstandarkan pembuatan referensi ini. Faktanya, jika Anda melihat tautan itu, itu memiliki contoh serupa.
Bagaimana saya bisa menyelesaikan tugas ini?
Agar jelas, MongoDB tidak bersifat relasional. Tidak ada "bentuk normal" standar. Anda harus membuat model database Anda sesuai dengan data yang Anda simpan dan kueri yang ingin Anda jalankan.
Kita dapat mendefinisikan apa yang disebut foreign key
di MongoDB. Namun, kami perlu menjaga integritas data SENDIRI . Sebagai contoh,
student
{
_id: ObjectId(...),
name: 'Jane',
courses: ['bio101', 'bio102'] // <= ids of the courses
}
course
{
_id: 'bio101',
name: 'Biology 101',
description: 'Introduction to biology'
}
The courses
field berisi _id
s kursus. Mudah untuk mendefinisikan hubungan satu-ke-banyak. Namun, jika kita ingin mengambil nama mata kuliah siswa Jane
, kita perlu melakukan operasi lain untuk mengambil course
dokumen melalui _id
.
Jika kursus bio101
dihapus, kita perlu melakukan operasi lain untuk memperbarui courses
bidang di student
dokumen.
Sifat MongoDB tipe dokumen mendukung cara-cara fleksibel untuk menentukan hubungan. Untuk menentukan hubungan satu ke banyak:
Contoh:
student
{
name: 'Kate Monster',
addresses : [
{ street: '123 Sesame St', city: 'Anytown', cc: 'USA' },
{ street: '123 Avenue Q', city: 'New York', cc: 'USA' }
]
}
Seperti contoh student
/ di course
atas.
Cocok untuk one-to-squillions, seperti pesan log.
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
}
Sebenarnya, a host
adalah induk dari a logmsg
. Mengacu pada host
id menghemat banyak ruang mengingat bahwa pesan log adalah squillions.
Referensi:
Alternatif lain untuk menggunakan gabungan adalah denormalisasi data Anda. Secara historis, denormalisasi dicadangkan untuk kode yang sensitif terhadap kinerja, atau ketika data harus diambil gambarnya (seperti di log audit). Namun, dengan popularitas NoSQL yang terus berkembang, banyak di antaranya tidak memiliki sambungan, denormalisasi sebagai bagian dari pemodelan normal menjadi semakin umum. Ini tidak berarti Anda harus menduplikasi setiap informasi di setiap dokumen. Namun, daripada membiarkan ketakutan data duplikat mendorong keputusan desain Anda, pertimbangkan untuk membuat model data Anda berdasarkan informasi apa yang termasuk dalam dokumen apa.
Begitu,
student
{
_id: ObjectId(...),
name: 'Jane',
courses: [
{
name: 'Biology 101',
mark: 85,
id:bio101
},
]
}
Jika ini adalah data API RESTful, ganti id kursus dengan tautan GET ke sumber daya kursus
Tujuan ForeignKey adalah untuk mencegah pembuatan data jika nilai bidang tidak cocok dengan ForeignKey-nya. Untuk mencapai ini di MongoDB, kami menggunakan middlewares Skema yang memastikan konsistensi data.
Silakan lihat dokumentasinya. https://mongoosejs.com/docs/middleware.html#pre