Advertisement
  1. Code
  2. Databases

Memetakan Database Relasional dan SQL ke MongoDB

Scroll to top
Read Time: 11 min

() translation by (you can also view the original English article)

Database NoSQL telah muncul sangat dalam beberapa tahun terakhir karena strukturnya yang kurang dibatasi, desain skema yang skalabel, dan akses yang lebih cepat dibandingkan dengan database relasional tradisional (RDBMS/SQL). MongoDB adalah database NoSQL berorientasi dokumen sumber terbuka yang menyimpan data dalam bentuk objek seperti JSON. Itu telah muncul sebagai salah satu database terkemuka karena skema dinamis, skalabilitas tinggi, kinerja kueri optimal, pengindeksan lebih cepat dan komunitas pengguna aktif.

Jika Anda berasal dari latar belakang RDBMS/SQL, memahami konsep NoSQL dan MongoDB bisa agak sulit saat memulai karena kedua teknologi memiliki cara representasi data yang sangat berbeda. Artikel ini akan mengarahkan Anda untuk memahami bagaimana RDBMS/SQL domain, fungsionalitasnya, istilah dan peta bahasa kueri ke database MongoDB. Dengan pemetaan, maksud saya bahwa jika kita memiliki konsep dalam RDBMS/SQL, kita akan melihat apa konsep yang sama dalam MongoDB.

Kita akan mulai dengan memetakan konsep-konsep dasar relasional seperti tabel, baris, kolom, dll dan bergerak untuk membahas pengindeksan dan join. Kami kemudian akan memeriksa kueri SQL dan mendiskusikan kueri basis data MongoDB yang sesuai. Artikel ini mengasumsikan bahwa Anda mengetahui konsep basis data relasional dasar dan SQL, karena sepanjang artikel ini akan lebih ditekankan pada pemahaman bagaimana konsep-konsep ini dipetakan dalam MongoDB. Mari kita mulai.


Memetakan Tabel, Baris dan Kolom

Setiap database di MongoDB terdiri dari koleksi yang setara dengan database RDBMS yang terdiri dari tabel SQL. Setiap pengumpulan menyimpan data dalam bentuk dokumen yang sama dengan tabel yang menyimpan data dalam baris. Sementara baris menyimpan data dalam kumpulan kolomnya, sebuah dokumen memiliki struktur mirip JSON (dikenal sebagai BSON di MongoDB). Terakhir, cara kita memiliki baris dalam baris SQL, kita memiliki bidang dalam MongoDB. Berikut ini adalah contoh dokumen (baris baca) yang memiliki beberapa bidang (kolom baca) yang menyimpan data pengguna:

1
{
2
"_id": ObjectId("5146bb52d8524270060001f3"),
3
"age": 25,
4
"city": "Los Angeles",
5
"email": "mark@abc.com",
6
"user_name": "Mark Hanks"
7
}

Dokumen ini sama dengan satu baris dalam RDBMS. Koleksi terdiri dari banyak dokumen seperti halnya tabel terdiri dari banyak baris. Perhatikan bahwa setiap dokumen dalam koleksi memiliki bidang _id unik, yang merupakan bidang 12 byte yang berfungsi sebagai kunci utama untuk dokumen. Bidang ini dibuat secara otomatis saat membuat dokumen dan digunakan untuk mengidentifikasi setiap dokumen secara unik.

Untuk memahami pemetaan dengan lebih baik, mari kita ambil contoh users tabel SQL dan struktur terkait di MongoDB. Seperti yang ditunjukkan pada Fig 1, setiap baris dalam tabel SQL mentransformasikan ke dokumen dan setiap kolom ke bidang di MongoDB.

Figure 1 Mapping Table to Collection (1)Figure 1 Mapping Table to Collection (1)Figure 1 Mapping Table to Collection (1)
Gambar 1

Skema Dinamis

Satu hal yang menarik untuk menjadi fokus di sini adalah bahwa berbagai dokumen dalam koleksi dapat memiliki skema yang berbeda. Jadi, dimungkinkan dalam MongoDB untuk satu dokumen memiliki lima bidang dan dokumen lainnya memiliki tujuh bidang. Kolom dapat dengan mudah ditambahkan, dihapus, dan dimodifikasi kapan saja. Juga, tidak ada batasan pada tipe data bidang. Jadi, pada satu contoh, suatu bidang dapat menyimpan data tipe int dan pada contoh berikutnya bidang tersebut dapat menyimpan sebuah array.

Konsep-konsep ini harus tampak sangat berbeda dengan pembaca yang berasal dari latar belakang RDBMS di mana struktur tabel, kolom, tipe data, dan relasinya sudah ditentukan sebelumnya. Fungsionalitas ini untuk menggunakan skema dinamis memungkinkan kami untuk menghasilkan dokumen dinamis pada saat run time.

Misalnya, pertimbangkan dua dokumen berikut di dalam koleksi yang sama tetapi memiliki skema yang berbeda (Gbr 2):

Figure 2 Documents in a Collection having different structureFigure 2 Documents in a Collection having different structureFigure 2 Documents in a Collection having different structure
Gambar 2

Dokumen pertama berisi bidang address dan dob yang tidak ada dalam dokumen kedua sedangkan dokumen kedua berisi bidang gender dan occupation yang tidak ada di yang pertama. Bayangkan jika kita akan merancang hal ini dalam SQL, kita akan menyimpan empat kolom tambahan untuk address, dobgender dan occupation, beberapa di antaranya akan menyimpan nilai kosong (atau null), dan karenanya menempati ruang yang tidak perlu.

Model skema dinamis ini adalah alasan mengapa basis data NosSQL sangat skalabel dalam hal desain. Berbagai skema kompleks (hierarkis, struktur pohon, dll) yang membutuhkan jumlah tabel RDBMS dapat dirancang secara efisien menggunakan dokumen-dokumen tersebut. Contoh tipikal adalah menyimpan posting pengguna, suka mereka, komentar dan informasi terkait lainnya dalam bentuk dokumen. Implementasi SQL untuk hal yang sama idealnya memiliki tabel terpisah untuk menyimpan posting, komentar dan suka sementara dokumen MongoDB dapat menyimpan semua informasi ini dalam satu dokumen.


Memetakan Join dan Relationship

Relationship dalam RDBMS dicapai menggunakan hubungan kunci primer dan asing dan men-kueri mereka yang menggunakan join. Tidak ada pemetaan langsung seperti itu di MongoDB tetapi hubungan di sini dirancang menggunakan dokumen yang tersemat dan tertaut.

Pertimbangkan contoh di mana kita perlu menyimpan informasi pengguna dan informasi kontak yang sesuai. Desain SQL yang ideal akan memiliki dua tabel, katakanlah user_information dan contact_information, dengan id kunci primer dan contact_id seperti yang ditunjukkan pada Gambar 3. Tabel contact_information juga akan berisi kolom user_id yang akan menjadi kunci foreign yang menghubungkan ke bidang id dari tabel user_information.

Figure 3Figure 3Figure 3
Gambar 3

Sekarang kita akan melihat bagaimana kita akan merancang hubungan seperti itu di MongoDB menggunakan pendekatan Menghubungkan dokumen dan dokumen Tertanam. Perhatikan bahwa dalam skema SQL, kami biasanya menambahkan kolom (seperti id dan contact_id dalam kasus kami) yang bertindak sebagai kolom utama untuk tabel itu. Namun, di MongoDB, kami biasanya menggunakan bidang _id yang dibuat secara otomatis sebagai kunci utama untuk mengidentifikasi dokumen secara unik.

Menautkan Dokumen

Pendekatan ini akan menggunakan dua koleksi, user_information dan contact_information keduanya memiliki bidang _id unik mereka. Kami akan memiliki bidang user_id dalam dokumen contact_information yang berkaitan dengan bidang _id dari dokumen user_information yang menunjukkan pengguna yang sesuai dengan kontak. (Lihat Gambar 4) Perhatikan bahwa dalam MongoDB, relasi dan operasi terkaitnya harus dijaga secara manual (misalnya, melalui kode) karena tidak ada batasan dan aturan kunci foreign yang berlaku.

Figure 4 Linking Documents in MongoDBFigure 4 Linking Documents in MongoDBFigure 4 Linking Documents in MongoDB
Gambar 4

Bidang user_id dalam dokumen kami hanyalah bidang yang menampung beberapa data dan semua logika yang terkait dengannya harus diimplementasikan oleh kami. Sebagai contoh, bahkan jika Anda akan menyisipkan beberapa user_id dalam dokumen contact_information yang tidak ada dalam koleksi user_information, MongoDB tidak akan membuang kesalahan yang mengatakan bahwa user_id yang sesuai tidak ditemukan dalam koleksi user_information (tidak seperti SQL di mana ini akan menjadi batasan kunci foreign tidak valid).

Dokumen yang Disematkan

Pendekatan kedua adalah menyematkan dokumen contact_information di dalam dokumen user_information seperti ini (Gbr 5):

Figure 5 Embedding Documents in MongoDBFigure 5 Embedding Documents in MongoDBFigure 5 Embedding Documents in MongoDB
Gambar 5

Dalam contoh di atas, kami telah menempelkan dokumen kecil informasi kontak di dalam informasi pengguna. Dengan cara yang sama, dokumen kompleks yang besar dan data hierarkis dapat disematkan seperti ini untuk menghubungkan entitas.

Juga, pendekatan mana yang digunakan antara pendekatan Linking dan Embedded tergantung pada skenario spesifik. Jika data yang akan disematkan diharapkan tumbuh lebih besar dalam ukuran, lebih baik menggunakan pendekatan Linking daripada pendekatan Embedded untuk menghindari dokumen menjadi terlalu besar. Pendekatan Embedded umumnya digunakan dalam kasus-kasus di mana sejumlah informasi terbatas (seperti alamat dalam contoh kami) harus disematkan.


Bagan Pemetaan

Untuk meringkas, bagan berikut (Gambar 6) mewakili hubungan bersama umum yang telah kita bahas:

Figure 6 Mapping ChartFigure 6 Mapping ChartFigure 6 Mapping Chart
Gambar 6

Memetakan SQL ke Kueri MongoDB

Sekarang kami merasa nyaman dengan pemetaan dasar antara RDBMS dan MongoDB, kami akan membahas bagaimana bahasa query yang digunakan untuk berinteraksi dengan database berbeda di antara mereka.

Untuk kueri MongoDB, mari kita asumsikan koleksi users dengan struktur dokumen sebagai berikut:

1
{
2
"_id": ObjectId("5146bb52d8524270060001f3"),
3
"post_text":"This is a sample post" ,
4
"user_name": "mark",
5
"post_privacy": "public",
6
"post_likes_count": 0
7
}

Untuk kueri SQL, kami menganggap users tabel memiliki lima kolom dengan struktur berikut:

Figure 7 Sample SQL TableFigure 7 Sample SQL TableFigure 7 Sample SQL Table
Gambar 7

Kami akan membahas kueri terkait untuk membuat dan mengubah koleksi (atau tabel), menyisipkan, membaca, memperbarui, dan menghapus dokumen (atau baris). Ada dua kueri untuk setiap titik, satu untuk SQL dan satu lagi untuk MongoDB. Saya akan menjelaskan kueri MongoDB hanya karena kita cukup akrab dengan kueri SQL. Kueri MongoDB yang disajikan di sini ditulis dalam shell JavaScript Mongo sementara kueri SQL ditulis dalam MySQL.

Membuat

Di MongoDB, tidak perlu secara eksplisit membuat struktur koleksi (seperti yang kita lakukan untuk tabel menggunakan kueri CREATE TABLE). Struktur dokumen dibuat secara otomatis ketika memasukkan pertama kali dalam koleksi. Namun, Anda dapat membuat koleksi kosong menggunakan perintah createCollection.

1
2
SQL: CREATE TABLE `posts` (`id` int(11) NOT NULL AUTO_INCREMENT,`post_text` varchar(500) NOT NULL,`user_name` varchar(20) NOT NULL,`post_privacy` varchar(10) NOT NULL,`post_likes_count` int(11) NOT NULL,PRIMARY KEY (`id`))
3
4
MongoDB: db.createCollection("posts")

Memasukan

Untuk menyisipkan dokumen dalam MongoDB, kami menggunakan metode insert yang mengambil objek dengan pasangan nilai kunci sebagai inputnya. Dokumen yang dimasukkan akan berisi bidang _id yang dibuat secara otomatis. Namun, Anda juga dapat secara eksplisit memberikan nilai 12 byte sebagai _id bersama dengan bidang lainnya.

1
2
SQL: INSERT INTO `posts` (`id` ,`post_text` ,`user_name` ,`post_privacy` ,`post_likes_count`)VALUES (NULL ,  'This is a sample post',  'mark',  'public',  '0');
3
4
MongoDB:  db.posts.insert({user_name:"mark", post_text:"This is a sample post", post_privacy:"public", post_likes_count:0})

Tidak ada fungsi Alter Table di MongoDB untuk mengubah struktur dokumen. Karena dokumen bersifat dinamis dalam skema, skema akan berubah seiring dan saat pembaruan apa pun terjadi pada dokumen.

Baca

MongoDB menggunakan metode find yang setara dengan perintah SELECT dalam SQL. Pernyataan berikut cukup membaca semua dokumen dari koleksi posts.

1
2
SQL: SELECT * FROM  `posts`
3
4
MongoDB: db.posts.find()

Kueri berikut melakukan pencarian bersyarat untuk dokumen yang memiliki bidang user_name sebagai mark. Semua kriteria untuk mengambil dokumen harus ditempatkan di kurung kurawal {} dipisahkan oleh koma.

1
2
SQL: SELECT * FROM `posts` WHERE `user_name` =  'mark'
3
4
MongoDB: db.posts.find({user_name:"mark"})

Kueri berikut mengambil kolom, post_text dan post_likes_count tertentu seperti yang ditentukan dalam set kedua tanda kurung {}.

1
2
SQL: SELECT  `post_text` ,  `post_likes_count` FROM  `posts`
3
4
MongoDB: db.posts.find({},{post_text:1,post_likes_count:1})

Perhatikan bahwa MongoDB secara default mengembalikan bidang _id dengan setiap pernyataan find. Jika kita tidak ingin bidang ini di set hasil kita, kita harus menentukan kunci _id dengan nilai 0 dalam daftar kolom yang akan diambil. Nilai kunci 0 menunjukkan bahwa kami ingin mengecualikan bidang ini dari hasil yang ditetapkan.

1
2
MongoDB: db.posts.find({},{post_text:1,post_likes_count:1,_id:0})

Kueri berikut mengambil bidang tertentu berdasarkan kriteria yang dimana user_name adalah mark.

1
2
SQL: SELECT  `post_text` , `post_likes_count` FROM `posts` WHERE `user_name` =  'mark'
3
4
MongoDB: db.posts.find({user_name:"mark"},{post_text:1,post_likes_count:1})

Kami sekarang akan menambahkan satu kriteria lagi untuk mengambil posting dengan tipe privasi sebagai publik. Bidang kriteria yang ditentukan menggunakan koma mewakili logika kondisi AND. Dengan demikian, pernyataan ini akan mencari dokumen yang memiliki user_name sebagai mark dan post_privacy sebagai public.

1
2
SQL: SELECT  `post_text` ,  `post_likes_count` FROM  `posts` WHERE  `user_name` =  'mark' AND  `post_privacy` =  'public'
3
4
MongoDB: db.posts.find({user_name:"mark",post_privacy:"public"},{post_text:1,post_likes_count:1})

Untuk menggunakan logika OR antara kriteria dalam metode find, kami menggunakan $or operator.

1
2
SQL: SELECT  `post_text` ,  `post_likes_count` FROM  `posts` WHERE  `user_name` =  'mark' OR  `post_privacy` =  'public'
3
4
MongoDB: db.posts.find({$or:[{user_name:"mark"},{post_privacy:"public"}]},{post_text:1,post_likes_count:1})

Selanjutnya, kita akan menggunakan metode sort yang mengurutkan hasilnya dalam urutan ascending post_likes_count (ditunjukkan oleh 1).

1
2
SQL: SELECT *  FROM `posts` WHERE `user_name` = 'mark' order by post_likes_count ASC
3
4
MongoDB: db.posts.find({user_name:"mark"}).sort({post_likes_count:1})

Untuk mengurutkan hasil dalam urutan descending, kami menetapkan -1 sebagai nilai bidang.

1
2
SQL: SELECT *  FROM `posts` WHERE `user_name` = 'mark' order by post_likes_count DESC
3
4
MongoDB: db.posts.find({user_name:"mark"}).sort({post_likes_count:-1})

Untuk membatasi jumlah dokumen yang akan dikembalikan, kami menggunakan metode limit yang menentukan jumlah dokumen.

1
2
SQL: SELECT *  FROM `posts` LIMIT 10
3
4
MongoDB: db.posts.find().limit(10)

Cara kami menggunakan offset dalam SQL untuk melewati beberapa record, kami menggunakan fungsi skip di MongoDB. Misalnya, pernyataan berikut akan mengambil sepuluh pos yang dilewati lima pos pertama.

1
2
SQL: SELECT *  FROM `posts` LIMIT 10 OFFSET  5
3
4
MongoDB: db.posts.find().limit(10).skip(5)

Memperbarui

Parameter pertama ke metode update menentukan kriteria untuk memilih dokumen. Parameter kedua menentukan operasi pembaruan aktual yang akan dilakukan. Sebagai contoh, kueri berikut memilih semua dokumen dengan user_name sebagai mark dan menetapkan post_privacy sebagai private.

Satu perbedaan di sini adalah bahwa secara default, MongoDB kueri update yang hanya memperbarui satu (dan yang pertama cocok) dokumen. Untuk memperbarui semua dokumen yang cocok, kami harus menyediakan parameter ketiga yang menentukan multi sebagai true yang menunjukkan bahwa kami ingin memperbarui beberapa dokumen.

1
SQL: UPDATE posts SET post_privacy = "private" WHERE user_name='mark'
2
3
MongoDB: db.posts.update({user_name:"mark"},{$set:{post_privacy:"private"}},{multi:true})

Hapus

Menghapus dokumen sangat sederhana dan mirip dengan SQL.

1
2
SQL: DELETE FROM posts WHERE user_name='mark'
3
 
4
MongoDB:  db.posts.remove({user_name:"mark"})

Pengindeksan

MongoDB memiliki index default yang dibuat pada bidang _id dari setiap koleksi. Untuk membuat indeks baru di bidang, kami menggunakan metode ensureIndex menentukan bidang dan urutan pengurutan terkait ditunjukkan oleh 1 atau -1 (ascending atau descending).

1
2
SQL: CREATE INDEX index_posts ON posts(user_name,post_likes_count DESC)
3
4
MongoDB: db.posts.ensureIndex({user_name:1,post_likes_count:-1})

Untuk melihat semua indeks yang ada dalam koleksi apa pun, kami menggunakan metode getIndexes pada baris yang sama dari query sql SHOW INDEX.

1
2
SQL: SHOW INDEX FROM posts
3
4
MongoDB: db.posts.getIndexes()

Kesimpulan

Dalam artikel ini, kami memahami bagaimana konsep dan istilah dasar RDBMS/SQL berhubungan dalam MongoDB. Kami melihat merancang hubungan dalam MongoDB dan belajar bagaimana fungsionalitas pemetaan kueri SQL dasar di MongoDB.

Setelah memulainya dengan artikel ini, Anda bisa mencoba kueri yang rumit termasuk agregasi, pengurangan map, dan kueri yang melibatkan banyak koleksi. Anda juga dapat mengambil bantuan beberapa alat online untuk mengonversi kueri SQL ke kueri MongoDB di awal. Anda bisa bermain merancang sampel skema database MongoDB sendiri. Salah satu contoh terbaik untuk melakukannya adalah database untuk menyimpan posting pengguna, like mereka, komentar dan like komentar. Ini akan memberi Anda pandangan praktis tentang desain skema fleksibel yang ditawarkan MongoDB.

Jangan ragu untuk berkomentar saran, pertanyaan atau ide yang ingin Anda lihat lebih lanjut.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.