Bagaimana cara mendesain skema seperti ini di MongoDB? Saya pikir tidak ada kunci asing!
sql
mongodb
foreign-keys
nosql
Mark Pegasov
sumber
sumber
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.
sumber
Pertama, untuk memperjelas beberapa konvensi penamaan. MongoDB menggunakan
collections
bukantables
.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.
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.
sumber
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 siswaJane
, kita perlu melakukan operasi lain untuk mengambilcourse
dokumen melalui_id
.Jika kursus
bio101
dihapus, kita perlu melakukan operasi lain untuk memperbaruicourses
bidang distudent
dokumen.Selengkapnya: Desain Skema MongoDB
Sifat MongoDB tipe dokumen mendukung cara-cara fleksibel untuk menentukan hubungan. Untuk menentukan hubungan satu ke banyak:
Dokumen yang disematkan
Contoh:
student { name: 'Kate Monster', addresses : [ { street: '123 Sesame St', city: 'Anytown', cc: 'USA' }, { street: '123 Avenue Q', city: 'New York', cc: 'USA' } ] }
Referensi anak
Seperti contoh
student
/ dicourse
atas.Referensi orang tua
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 alogmsg
. Mengacu padahost
id menghemat banyak ruang mengingat bahwa pesan log adalah squillions.Referensi:
sumber
Dari The Little MongoDB Book
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
sumber
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
sumber