복붙노트

[MONGODB] 중복 몽고 ObjectId가의 가능성은 두 개의 서로 다른 컬렉션에서 생성되는거야?

MONGODB

중복 몽고 ObjectId가의 가능성은 두 개의 서로 다른 컬렉션에서 생성되는거야?

똑같은 몽고 ObjectId가 두 개의 서로 다른 컬렉션을 문서에 대해 생성하는 것이 가능합니까? 나는 그것이 매우 가능성이 분명하지만 그것이 가능하다는 것을 깨닫게?

너무 구체적를받지 않고, 내가 물어 이유는 우리가 우리 사이트의 전체 깃털 사용자로 변환 희망 선출 된 공무원의 공개 프로필을 보여에 내가 일하고 있다는 응용 프로그램. 우리는 사용자와 현재 우리 사이트의 구성원이 아닌 선출 된 공무원에 대해 별도의 컬렉션을 가지고있다. 사람에 대한 모든 맵 다시는 선출 된 공식 ObjectId가를 사용하는 선출직 공무원에 대한 각종 데이터를 포함하는 다양한 문서가 있습니다.

계정을 만든 후 우리는 여전히 선출 된 공무원에게 연관된 데이터를 강조하지만 그들은 이제 해당 사용자와 사용자의 콜렉션의 일부가 우리의 응용 프로그램과의 상호 작용에 프로필을 매핑 할 OBJECTID입니다.

우리는 몇 달 전에 몽고 MySQL에서 우리의 응용 프로그램을 변환하기 시작했다 그리고 우리가 전환에있는 동안 우리는 이러한 데이터 유형 모두에 대해 기존의 MySQL의 ID를 저장하고 우리는 또한 현재 사용자에 선출 된 공식 몽고 ObjectId가를 저장하기 시작하고 문서를 다시 선출 공식 데이터에 매핑합니다.

난 그냥 일을 간단하게 이전 선출 된 공식 ObjectId가로 새 사용자 ObjectId가 지정 숙고하지만 기존 사용자 ObjectId가와의 충돌을 할 수 없었습니다 있는지 확인하고 싶어했다.

당신의 통찰력 주셔서 감사합니다.

편집 : 바로이 질문을 게시 한 후, 내 제안 된 솔루션이 아주 좋은 생각이 아니라는 것을 깨달았다. 그것은 더 나은 그냥하는 우리는 사용자 문서에서 선출 된 공식 '_id'에 장소와 바로 링크 가지고 현재의 스키마를 유지하는 것입니다.

해결법

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

    1.짧은 답변

    짧은 답변

    그냥 초기 질문에 직접 응답을 추가합니다 : 당신이 BSON 개체 ID 생성을 사용하는 경우 YES, 다음, 대부분의 운전자의 ID가 거의 확실 컬렉션에서 고유해야 할 것입니다. 무엇을 "거의 확실"방법은 아래를 참조하십시오.

    긴 대답

    BSON 개체 ID는 가능성이 높다 컬렉션에서 고유된다 몽고 DB 드라이버에 의해 발생합니다. 이 때문에 주로 대부분의 운전자에 대한 정적 증분 카운터를 통해 생성되는 ID의 마지막 3 바이트이다. 즉 카운터 수집 독립적이며; 그것은 세계입니다. 자바 드라이버는, 예를 들어, 무작위로 초기화 정적 AtomicInteger를 사용합니다.

    그래서 이유를 몽고의 문서에서, 그들은 독특한 될 것이라는 말을 크게들이 ID를 고유 할 "가능성이 높다"이다라고 할 대신? 고유 한 ID를받지 않습니다 경우 세 가지 가능성 (더가있는 경우 알려 주시기 바랍니다) 발생할 수 있습니다 :

    이 논의하기 전에, BSON 개체 ID가 구성되어 있음을 기억 :

    [4, 2 프로세스 ID 바이트 3 기계 해시 바이트, 에포크 이후 초 3 바이트 카운터 바이트]

    당신이 속는 사람을 얻는 것입니다 가능성을 스스로 판단 할 수 있도록 여기에 세 가지 가능성이 있습니다 :

    1) 카운터 오버 플로우 : 카운터에서 3 바이트가있다. 단일 두 번째 (2 ^ 24) 문서 16777216을 통해 삽입 일 경우, 동일한 시스템에, 동일한 프로세스에서, 당신은 증가 카운터가 바이트 오버 플로우 수 있으며, 같은 시간을 공유하는 두 개체 ID, 기계와 끝까지 프로세스 및 카운터 값.

    2) 카운터 비 증가 : 일부 몽고 드라이버는 카운터 바이트 임의의 숫자 대신의 증가 숫자를 사용합니다. 이 경우 동일한에서, 비 고유 ID를 생성하는 1 / 16,777 가능성이 있지만 두 아이디가 동일한 제에서 발생하는 경우에만 (즉, 다음의 두 번째 행의 ID 업데이트 시간 구간 이전) 기계, 동일한 처리이다.

    3) 동일한 값 기계 및 공정 해시. 기계 ID 및 프로세스 ID 값은, 일부 희박 시나리오에서, 두 개의 서로 다른 시스템에 대해 같은 값에 매핑 할 수 있습니다. 이러한 일이 발생하고, 동시에 두 개의 서로 다른 시스템에있는 두 개의 카운터가 같은 초 동안 같은 값을 생성하는 경우에, 당신은 중복 ID하게 될 겁니다.

    다음은 조심하는 세 가지 시나리오입니다. 시나리오 1과 3은 희박 것, 그리고 올바른 드라이버를 사용하는 경우 시나리오 2는 완전히 피할 수있다. 당신은 확실히 알 수있는 드라이버의 소스를 확인해야합니다.

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

    2.하며 Object 같은 데이터베이스에 저장 약간 더 좋은 특성뿐만 UUID와 유사한 방식으로 클라이언트 측 생성 정도가 증가하는 순서 무료 그들의 생성 시간을 인코딩하는 단계를 포함한다. 사용 사례에 대한 중요한 것은 그들이 서로 다른 시스템에서 생성 된 경우에도 높은 확률로 보증 고유성에 설계되어 있다는 점이다.

    하며 Object 같은 데이터베이스에 저장 약간 더 좋은 특성뿐만 UUID와 유사한 방식으로 클라이언트 측 생성 정도가 증가하는 순서 무료 그들의 생성 시간을 인코딩하는 단계를 포함한다. 사용 사례에 대한 중요한 것은 그들이 서로 다른 시스템에서 생성 된 경우에도 높은 확률로 보증 고유성에 설계되어 있다는 점이다.

    당신은 일반적으로 _id 필드를 참조한다면 이전 _id를 다시 사용하는 것이 안전합니다 그래서 지금, 우리는 컬렉션에 걸쳐 고유성이 필요하지 않습니다. 구체적인 예를 들어, 두 개의 컬렉션, 색과 과일이있는 경우,이 동시에 같은 개체를 가질 수 {_id : '오렌지'}.

    혹시하며 Object가 생성하는 방법에 대한 자세한 내용을 알고 싶어, 여기에 사양은 ​​다음과 같습니다 http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification

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

    3.경우 사람이 중복 몽고하며 Object에 문제가있다, 당신은 몽고 자체에서 일어나는 DUPS의 unlikelihood에도 불구하고 중복 _id가 몽고에서 PHP로 생성 된 것 가지고하는 것이 가능하다는 것을 알아야한다.

    경우 사람이 중복 몽고하며 Object에 문제가있다, 당신은 몽고 자체에서 일어나는 DUPS의 unlikelihood에도 불구하고 중복 _id가 몽고에서 PHP로 생성 된 것 가지고하는 것이 가능하다는 것을 알아야한다.

    나는 데이터 집합 통해 반복과 모음에 데이터를 삽입하려고하고있을 때이 나를 위해 규칙에 일어난 유스 케이스입니다.

    당신이 _id 값을 지정하지 않더라도 - 사출 데이터를 명시 적으로 반복 될 때마다 재설정해야합니다 보유하고 배열입니다. 어떤 이유 INSERT 프로세스는 전역 변수 (배열 전역이 없더라도) 것처럼 몽고 어레이에 추가 _ID. 당신은 당신이 일반적으로 호출 기능을 다시 유지하지 않는 배열의 값을 기대하는 별도의 함수 호출에 삽입을 호출하는 경우에도이 당신에 영향을 줄 수 있습니다.

    이 세 가지 해결책이 있습니다 :

    내 생각이 너무 많은 몽고에 문제는 PHP 인터페이스에서 버그가 아닌 것입니다,하지만이 문제가 발생하는 경우, 단지 _id를 설정 해제하고 당신이 잘되어야합니다.

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

    4.컬렉션에서 ObjectId가 고유성에 대한 보장의 무엇이든지가 없습니다. 이 확률 적으로 매우 확률이 낮다하더라도, 그것은 컬렉션에서 _id 고유성에 의존 매우 가난한 애플리케이션 설계를 할 것이다.

    컬렉션에서 ObjectId가 고유성에 대한 보장의 무엇이든지가 없습니다. 이 확률 적으로 매우 확률이 낮다하더라도, 그것은 컬렉션에서 _id 고유성에 의존 매우 가난한 애플리케이션 설계를 할 것이다.

    하나는 쉽게 몽고 쉘이를 테스트 할 수 있습니다 :

    MongoDB shell version: 1.6.5
    connecting to: test
    > db.foo.insert({_id: 'abc'})
    > db.bar.insert({_id: 'abc'})
    > db.foo.find({_id: 'abc'})
    { "_id" : "abc" }
    > db.bar.find({_id: 'abc'})
    { "_id" : "abc" }
    > db.foo.insert({_id: 'abc', data:'xyz'})
    E11000 duplicate key error index: test.foo.$_id_  dup key: { : "abc" }
    

    그래서, 절대적으로 _id의이 컬렉션에서 고유 인에 의존하지 않는, 당신은 ObjectId가 생성 기능을 제어하지 않기 때문에, 그것에 의존하지 않습니다.

    그것은 더 UUID처럼 뭔가를 만들 수 있습니다, 그리고 당신이 수동으로 할 경우, 당신은 고유성의 더 좋은 보장을 가질 수있다.

    그냥 같은 컬렉션 당신이 "테이블"을 넣지 왜 그렇게 같은 컬렉션 다른 "종류"의 객체를 넣을 수 있습니다 기억하십시오. 그들은 같은 _id 공간을 공유하는 것, 따라서 고유의 보장 될 것이다. "미래"에서 "등록"으로 전환 필드의 간단한 반전 될 것 ...

  5. from https://stackoverflow.com/questions/4677237/possibility-of-duplicate-mongo-objectids-being-generated-in-two-different-colle by cc-by-sa and MIT license