복붙노트

[MONGODB] 어떻게되는 NoSQL 데이터베이스 (MongoDB의)에서 외래 키를 집행?

MONGODB

어떻게되는 NoSQL 데이터베이스 (MongoDB의)에서 외래 키를 집행?

하자 내가 같은 문서의 집합을 말한다 :

{ "_id" : 0 , "owner":0 "name":"Doc1"},{ "_id" : 1 , "owner":1, "name":"Doc1"}, etc

그리고, 다른 한편으로 소유자는 별도의 컬렉션으로 표현된다 :

{ "_id" : 0 , "username":"John"}, { "_id" : 1 , "username":"Sam"}

나는 확실히 내가 문서를 삽입 할 때 올바른 방법으로 사용자를 참조하는 것을 할 수있는 방법. 구식이 쉽게 외부 키를 사용하여 수행 할 수있는 RDBMS.

나는 내 비즈니스 코드에서 삽입의 정확성을 확인할 수 있다는 것을 알고, 그러나 나의 서버와 박았 "소유자"에 요청 공격자 탬퍼 경우 : (100)과 몽고는 예외 다시 throw하지 않습니다.

나는이 상황이 실제 단어 응용 프로그램에서 처리하는 방법을 알고 싶습니다.

사전에 감사합니다!

해결법

  1. ==============================

    1.(당신은 아마 눈치 챘로) MongoDB를 외국 키를 가지고 있지 않습니다. 기본적으로 대답은 따라서 "요청과 부정 조작 사용자를하지 마십시오. 오직 당신의 참조 무결성 규칙에 따라 데이터를 삽입 응용 프로그램을 수 있습니다."

    (당신은 아마 눈치 챘로) MongoDB를 외국 키를 가지고 있지 않습니다. 기본적으로 대답은 따라서 "요청과 부정 조작 사용자를하지 마십시오. 오직 당신의 참조 무결성 규칙에 따라 데이터를 삽입 응용 프로그램을 수 있습니다."

    MongoDB를가 많은 방법으로 중대하다 ...하지만 당신이 외래 키 필요하다는 것을 발견하면, 그것은 아마 당신의 문제에 대한 올바른 해결책이 아니다.

  2. ==============================

    2.특정 질문에 대답하기 위해 - MongoDB를 클라이언트 측에 외래 키 관계를 처리 격려하면서, 그들은 또한 "데이터베이스 참조"의 아이디어를 제공 -이 도움말 페이지를 참조하십시오.

    특정 질문에 대답하기 위해 - MongoDB를 클라이언트 측에 외래 키 관계를 처리 격려하면서, 그들은 또한 "데이터베이스 참조"의 아이디어를 제공 -이 도움말 페이지를 참조하십시오.

    그건 내가 DBRef을 사용하지 않는 것이 좋습니다 말했다. 어느 클라이언트 코드가 연결을 관리하거나 (더 좋은) 처음부터 함께 문서를 링크 할 수 있습니다. 당신은 소유자 개체 자체의 내부 소유자의 "문서"를 삽입하는 것이 좋습니다. 사용자의 사용 패턴에 맞게 문서를 조립하고 MongoDB를가 빛날 것입니다.

  3. ==============================

    3.되는 NoSQL 솔루션으로, 당신은 MariaDB를 사용할 수 있습니다 (NewSQL) 그것의 SQL 및 NoSQL에의 조합은 뛰어난 성능과 MySQL의 개발자에 의해 구현.

    되는 NoSQL 솔루션으로, 당신은 MariaDB를 사용할 수 있습니다 (NewSQL) 그것의 SQL 및 NoSQL에의 조합은 뛰어난 성능과 MySQL의 개발자에 의해 구현.

  4. ==============================

    4.또한 사용자 이름의 고유 경우, 다음 _ID로를 사용하는 것이 reccommend 것입니다. 당신은 인덱스에 저장됩니다. 문서에 저장되는 문서가 생성 및 코드 업데이트 그것의 다른 조각을주지 않을 때 '사용자 이름'의 값으로 응용 프로그램에서 '소유자'의 값을 설정합니다.

    또한 사용자 이름의 고유 경우, 다음 _ID로를 사용하는 것이 reccommend 것입니다. 당신은 인덱스에 저장됩니다. 문서에 저장되는 문서가 생성 및 코드 업데이트 그것의 다른 조각을주지 않을 때 '사용자 이름'의 값으로 응용 프로그램에서 '소유자'의 값을 설정합니다.

    소유자를 변경할 필요가있는 경우, 다음 구현 비즈니스 규칙에 적합한 API를 제공합니다.

    외래 키의 어떤 필요가 없을 것이다.

  5. ==============================

    5.누군가가 정말 프로젝트 / 웹 애플리케이션에서 외부 키를 시행하고자합니다. 그런 다음 당신은 MixSQL 접근 방식 즉, SQL + NoSQL이 인다

    누군가가 정말 프로젝트 / 웹 애플리케이션에서 외부 키를 시행하고자합니다. 그런 다음 당신은 MixSQL 접근 방식 즉, SQL + NoSQL이 인다

    그 많은 참조가없는 부피가 큰 데이터는 다음이되는 NoSQL 데이터베이스 저장소에 저장 될 수 있다는 것을 선호 할 것입니다. 마찬가지로 : 데이터의 호텔 또는 장소 유형입니다.

    등의 OAuth 모듈 테이블, TokenStore와의 UserDetails 및 UserRole (매핑 테이블)과 같은 몇 가지 심각한 일이 있다면하지만 .... 당신은 SQL로 갈 수 있습니다.

  6. ==============================

    6.이 일대일 관계에 있습니다. 대신 별도의 컬렉션을 유지, 더 나은 포함 하나 개의 문서에 서로에 있습니다. MongoDB를 자신의 장점에 그들을 모델링하는 방법을 여기에 확인하십시오.

    이 일대일 관계에 있습니다. 대신 별도의 컬렉션을 유지, 더 나은 포함 하나 개의 문서에 서로에 있습니다. MongoDB를 자신의 장점에 그들을 모델링하는 방법을 여기에 확인하십시오.

    그 명시 적으로 문서에 언급되지 않지만, 삽입은 당신에게 외래 키 제약하는 것과 같은 효과를 제공합니다. 그냥 이런 생각을 명확하게하고 싶다. 당신은 그런 두 컬렉션이있을 때 :

    C1 :

    { "_id" : 0 , "owner":0 "name":"Doc1"},{ "_id" : 1 , "owner":1, "name":"Doc1"}, etc
    

    C2 :

    { "_id" : 0 , "username":"John"}, { "_id" : 1 , "username":"Sam"}
    

    당신이 (MongoDB를 가정하는 것은 그것을 할 수 있습니다) C1._id를 참조 C2._id에 외래 키 제약 조건을 선언한다면, 그것은 당신이 할 수있는 것을 의미하지 C2._id는 C1에 존재하지 않는 C2에 문서를 넣습니다. 내장 된 문서와 비교해 :

    {
        "_id" : 0 , 
        "owner" : 0,
        "name" : "Doc1",
        "owner_details" : {
            "username" : "John"
        }
    }
    

    이제 owner_details 필드는 C2 컬렉션의 데이터를 나타내고, 나머지 필드는 C1의 데이터를 나타낸다. 당신은 존재하지 않는 문서에 owner_details 필드를 추가 할 수 없습니다. 당신은 기본적으로 동일한 효과를 달성하고 있습니다.

  7. from https://stackoverflow.com/questions/8195190/how-to-enforce-foreign-keys-in-nosql-databases-mongodb by cc-by-sa and MIT license