program tip

MongoDB 정규화, 외래 키 및 조인

radiobox 2020. 11. 21. 14:16
반응형

MongoDB 정규화, 외래 키 및 조인


며칠 동안 MongoDB에 깊이 빠져 들기 전에 나는 그것에 대해 전혀 뛰어 들어야할지 말지에 대해 꽤 기본적인 질문을 할 것이라고 생각했습니다. 기본적으로 nosql에 대한 경험이 없습니다.

문서 데이터베이스의 몇 가지 이점에 대해 조금 읽었으며이 새로운 응용 프로그램의 경우 정말 훌륭 할 것이라고 생각합니다. 많은 유형의 객체 (많은 m-to-m 관계) 및 하위 클래스에 대해 즐겨 찾기, 주석 등을 수행하는 것은 항상 번거 롭습니다. 처리하기가 일종의 고통입니다.

또한 매우 중첩되어 있고 15 개의 다른 테이블보다 훨씬 더 나은 문서로 변환되기 때문에 SQL에서 정의하기가 어려울 수있는 구조도 있습니다.

그러나 나는 몇 가지에 대해 혼란 스럽습니다.

  1. 데이터베이스를 정상화 상태로 유지하는 것이 바람직합니까? 여러 레코드를 업데이트하고 싶지 않습니다. 여전히 사람들이 MongoDB의 데이터베이스 설계에 접근하는 방식입니까?

  2. 사용자가 책을 즐겨 찾기에 추가했는데이 선택 사항이 여전히 사용자 문서에 저장되어 있는데 책이 삭제되면 어떻게됩니까? 외래 키없이 어떻게 관계가 분리됩니까? 모든 링크를 직접 삭제해야합니까?

  3. 사용자가 더 이상 존재하지 않는 책을 좋아하고 내가 쿼리 (일종의 조인)하면 어떻게 되나요? 여기서 내결함성을 수행해야합니까?


MongoDB는 서버 측 외래 키 관계를 지원하지 않으며 정규화도 권장되지 않습니다. 가능하면 부모 개체 내에 자식 개체를 포함해야합니다. 이렇게하면 성능이 향상되고 외래 키가 완전히 불필요 해집니다. 즉, 항상 가능한 것은 아니므로 다른 컬렉션의 개체를 참조 할 수있는 DBRef라는 특수 구조가 있습니다. DB가 객체를 읽기 위해 추가 쿼리를 만들어야하지만 일종의 외래 키 참조를 허용하기 때문에 이것은 그렇게 빠르지 않을 수 있습니다.

그래도 참조를 수동으로 처리해야합니다. DBRef를 찾는 동안에 만 존재하는지 확인할 수 있으며, DB는 참조를 찾기 위해 모든 문서를 거치지 않고 참조 대상이 더 이상 존재하지 않으면 제거합니다. 그러나 책을 삭제 한 후 모든 참조를 제거하려면 컬렉션 당 단일 쿼리가 필요하며 더 이상 그렇게 어렵지 않습니다.

스키마가 더 복잡한 경우 nosql이 아닌 관계형 데이터베이스를 선택해야합니다.

MongoDB 데이터베이스 설계에 관한 책도 있습니다. Document Design for MongoDB

업데이트 위의 책은 더 이상 사용할 수 없지만 MongoDB의 인기로 인해 다른 책이 많이 있습니다. 이러한 링크는 변경 될 수 있으므로 Amazon에서 간단한 검색으로 여러 페이지를 표시하므로 일부를 찾는 데 문제가되지 않습니다.

'수동 참조'에 대해서는 MongoDB 매뉴얼 페이지를 참조하고 자세한 내용과 예제는 DBRef참조 하십시오.


위의 @TomaaszStanczak은 말합니다.

MongoDB는 서버 측 외래 키 관계를 지원하지 않으며 정규화도 권장되지 않습니다. 가능하면 부모 개체 내에 자식 개체를 포함해야합니다. 이렇게하면 성능이 향상되고 외래 키가 완전히 불필요 해집니다. 그것은 항상 가능하지는 않다고 말했습니다 ...

Mongo는 정규화를 권장하지 않습니다. 명확히하기 위해, 우리는 두 데이터 엔티티가 가질 수있는 근본적으로 다른 두 가지 유형의 관계에 대해 이야기하고 있습니다. 하나에서 하나의 하위 엔티티는 상위 객체 독점적으로 소유 합니다. 이러한 유형의 관계에서 Mongo 방식은 삽입하는 것입니다.

다른 클래스의 관계에서 두 개체는 독립적으로 존재합니다. 독립적 인 수명과 관계를가집니다. 몽고는 이런 유형의 관계가 존재하지 않기를 바라며이를 어떻게 처리해야하는지에 대해 실망스럽게 침묵합니다. 임베딩은 해결책이 아닙니다. 정규화는 권장되지 않거나 권장되지 않습니다. Mongo는이를 처리하기위한 두 가지 메커니즘을 제공합니다. 수동 참조 (두 테이블을 바인딩하는 외래 키 제약 조건이있는 키와 유사 함 ) 및 DBRef (동일 작업을 수행하는 약간 더 구조화 된 다른 방법). 이 사용 사례에서 SQL 데이터베이스가 승리합니다.

참고 URL : https://stackoverflow.com/questions/5841681/mongodb-normalization-foreign-key-and-joining

반응형