MongoDB - ความสัมพันธ์
ความสัมพันธ์ใน MongoDB แสดงให้เห็นว่าเอกสารต่างๆมีความสัมพันธ์กันอย่างไร ความสัมพันธ์สามารถจำลองได้ผ่านEmbedded และ Referencedแนวทาง ความสัมพันธ์ดังกล่าวอาจเป็น 1: 1, 1: N, N: 1 หรือ N: N
ให้เราพิจารณากรณีการจัดเก็บที่อยู่สำหรับผู้ใช้ ดังนั้นผู้ใช้หนึ่งคนสามารถมีหลายที่อยู่ทำให้เป็นความสัมพันธ์แบบ 1: N
ต่อไปนี้เป็นโครงสร้างเอกสารตัวอย่างของ user เอกสาร -
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "Tom Hanks",
"contact": "987654321",
"dob": "01-01-1991"
}
ต่อไปนี้เป็นโครงสร้างเอกสารตัวอย่างของ address เอกสาร -
{
"_id":ObjectId("52ffc4a5d85242602e000000"),
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "Los Angeles",
"state": "California"
}
การสร้างแบบจำลองความสัมพันธ์แบบฝัง
ในวิธีการฝังเราจะฝังเอกสารที่อยู่ไว้ในเอกสารผู้ใช้
> db.users.insert({
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address": [
{
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "Los Angeles",
"state": "California"
},
{
"building": "170 A, Acropolis Apt",
"pincode": 456789,
"city": "Chicago",
"state": "Illinois"
}
]
}
})
วิธีนี้จะเก็บรักษาข้อมูลที่เกี่ยวข้องทั้งหมดไว้ในเอกสารเดียวซึ่งทำให้ง่ายต่อการดึงและบำรุงรักษา เอกสารทั้งหมดสามารถเรียกดูได้ในแบบสอบถามเดียวเช่น -
>db.users.findOne({"name":"Tom Benzamin"},{"address":1})
โปรดทราบว่าในข้อความค้นหาด้านบน db และ users เป็นฐานข้อมูลและคอลเลกชันตามลำดับ
ข้อเสียคือหากเอกสารที่ฝังไว้มีขนาดใหญ่เกินไปอาจส่งผลกระทบต่อประสิทธิภาพการอ่าน / เขียน
การสร้างแบบจำลองความสัมพันธ์ที่อ้างอิง
นี่คือแนวทางของการออกแบบความสัมพันธ์แบบปกติ ในแนวทางนี้ทั้งเอกสารผู้ใช้และเอกสารที่อยู่จะได้รับการดูแลแยกกัน แต่เอกสารผู้ใช้จะมีฟิลด์ที่อ้างอิงเอกสารที่อยู่id ฟิลด์
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address_ids": [
ObjectId("52ffc4a5d85242602e000000"),
ObjectId("52ffc4a5d85242602e000001")
]
}
ดังที่แสดงไว้ด้านบนเอกสารผู้ใช้ประกอบด้วยฟิลด์อาร์เรย์ address_idsซึ่งมี ObjectIds ของที่อยู่ที่เกี่ยวข้อง การใช้ ObjectIds เหล่านี้เราสามารถสืบค้นเอกสารที่อยู่และรับรายละเอียดที่อยู่ได้จากที่นั่น ด้วยวิธีนี้เราจะต้องมีคำค้นหาสองรายการ: อันดับแรกเพื่อดึงไฟล์address_ids เขตข้อมูลจาก user เอกสารและวินาทีเพื่อดึงข้อมูลที่อยู่เหล่านี้จาก address คอลเลกชัน
>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})