MongoDB-관계

MongoDB의 관계는 다양한 문서가 논리적으로 서로 어떻게 관련되어 있는지를 나타냅니다. 관계는 다음을 통해 모델링 할 수 있습니다.EmbeddedReferenced구혼. 이러한 관계는 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})

위의 쿼리에서 dbusers 각각 데이터베이스와 컬렉션입니다.

단점은 포함 된 문서의 크기가 계속 커지면 읽기 / 쓰기 성능에 영향을 미칠 수 있다는 것입니다.

참조 된 관계 모델링

이것이 정규화 된 관계를 설계하는 접근 방식입니다. 이 접근 방식에서는 사용자 문서와 주소 문서가 모두 별도로 유지되지만 사용자 문서에는 주소 문서의 주소를 참조하는 필드가 포함됩니다.id 들.

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001")
   ]
}

위와 같이 사용자 문서에는 배열 필드가 포함됩니다. address_ids해당 주소의 ObjectId를 포함합니다. 이러한 ObjectId를 사용하여 주소 문서를 쿼리하고 거기에서 주소 세부 정보를 가져올 수 있습니다. 이 접근 방식에서는 두 개의 쿼리가 필요합니다.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"]}})