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"]}})