2012-12-14 4 views
6

MongoDB를 사용하여 콘텐츠 태깅을 구현하고 싶습니다. 관계형 데이터베이스에서 가장 좋은 방법은 콘텐츠 (예 : 'products')과 태그 테이블 사이에 다 대다 관계를 갖는 것입니다. 그러나 NoSQL 데이터베이스를 사용하는 것이 가장 좋은 방법은 무엇입니까?MongoDB로 태그하는 콘텐츠

"내용"문서의 태그 배열의 모든 태그를 넣어, 또는 문자열에 태그에 대한 참조를 넣어 더 좋을까요?

+0

[Mongo에 게시 태그를 구현하는 방법] 가능한 복제본? (http://stackoverflow.com/questions/8455685/how-to-implement-post-tags-in-mongo) –

답변

10

MongoDB에서 n : m 관계가있는 대부분의 경우 참조하는 대신 포함을 사용해야합니다. 따라서 각 제품에 태그 이름이있는 "태그"배열을 사용하는 것이 좋습니다. 단일 제품을 살펴 보는 것이 시스템에서 가장 빈번한 유스 케이스라고 가정합니다. 이 디자인을 사용하면 단일 데이터베이스 쿼리로 태그 이름 목록이있는 제품을 사용자에게 표시 할 수 있습니다.

제품에 바인딩하지 않으려는 태그에 대한 추가 메타 데이터 (예 : 태그의 긴 텍스트 설명)가 필요하면 추가 태그 컬렉션을 만들 수 있습니다. 여기서 이름 필드 빠른 검색 및 중복 방지를위한 고유 색인을 얻습니다. 사용자가 태그 이름을 클릭하거나 가리키면 추가 쿼리를 사용하여 태그 세부 정보를 가져올 수 있습니다.

이 디자인에서 문제가되는 경우는 태그를 삭제하거나 이름을 바꾸려는 경우입니다. 그런 다음 태그가 포함 된 모든 제품을 수정해야합니다. 그러나 MongoDB는 SQL 데이터베이스와 같이 CASCADE ON DELETE를 사용하는 외래 키를 알지 못하기 때문에 서로 참조하는 문서가있을 때 항상이 문제가 발생합니다.

태그 이름 바꾸기는 제품 태그 배열에 이름 대신 objectID를 저장하여 쉽게 할 수 있습니다. 그러나 ID에는 사용자에게 쓸모가 없다는 단점이 있습니다. 제품 페이지를 표시하려면 태그의 이름을 가져와야합니다. 즉, 추가 데이터베이스 쿼리가 필요한 태그 컬렉션에서 모든 태그를 요청해야합니다.

+1

나는 생각하지 않는다. "대부분의 경우"라고 말하면서 퍼가기와 링크에 관해 조언 할 때 좋습니다. 그것은 실제로 유스 케이스에 의존하며, 태그에 대해서는 임베딩이 정확하다는 것이 확실하지만, 다른 n : m 관계에 대해서는 임베딩이 끔찍할 수도 있습니다. –

+0

@AsyaKamsky 무엇을 제안하나요? 이 경우 – mayankcpdixit

+2

을 삽입하는 것이 좋습니다. 나는 "대부분의 경우"에 포함시키는 것이 옳다는 제안에 반대합니다. –

관련 문제