MongoDB에서 자동 증분을 구현해야 합니까?
MySQL에서 MongoDB로 전환하고 있습니다.매우 기본적인 아키텍처로 친숙합니다.users
에는 테블에는자증있것입니다을이분동의 증분이 .uid
이 사용 사례는 Mongo 자체 설명서를 참조하십시오.
저는 이것이 최고의 건축적 결정인지 궁금합니다.하는 것을 . 를 들어 URL에서는 UX, UID, UID, UID를 사용합니다. 예를 들어 짧은 URL의 경우:http://example.com/users/12345
제3의 방법이 있습니까?IRC에 #mongodb
다양한 ID를 생성하여 캐시할 것을 제안했습니다.실제로 어떻게 구현해야 할지, 아니면 제가 갈 수 있는 다른 경로가 있는지 잘 모르겠습니다.나는 심지어 꼭 필요하지도 않습니다._id
이러한 방식으로 증가하는 자체. 는한것 한▁the▁as ▁long▁as는.users
고유한 의 모두유고한숫가있습니다지고자를있다▁all습▁a.uid
그 서류 안에서, 저는 행복할 것입니다.
MongoDB에 자동 증분 ID가 없으며 타당한 이유가 있다는 선택된 답변의 저자의 의견에 강력히 반대합니다.우리는 왜 10gen이 자동 증가 ID의 사용을 장려하지 않았는지 이유를 모릅니다.그건 추측입니다.클러스터 환경에서 12바이트 ID의 고유성을 보장하는 것이 더 쉽기 때문에 10gen이 이러한 선택을 했다고 생각합니다.대부분의 신규 고객에게 적합한 기본 솔루션이기 때문에 10세대의 비즈니스에 적합한 제품 채택률을 높입니다.
이제 상업 환경에서 ObjectId를 사용한 경험에 대해 모두에게 말씀드리겠습니다.
저는 소셜 네트워크를 구축하고 있습니다.우리는 약 6백만 명의 사용자가 있고 각 사용자는 약 20명의 친구가 있습니다.
이제 사용자(who를 따르는 사용자) 간의 관계를 저장하는 컬렉션이 있다고 상상해 보십시오.이렇게 생겼어요.
_id : ObjectId
user_id : ObjectId
followee_id : ObjectId
인 우리가특고를가있지는지수종합독한있는▁on.{user_id, followee_id}
이 인덱스의 크기는 12*2*6M*20 = 2GB로 추정할 수 있습니다.이것은 제가 팔로우하는 사람들의 빠른 조회를 위한 색인입니다.저를 따라오는 사람들의 빠른 조회를 위해서는 역색인이 필요합니다.그것은 또 다른 2GB입니다.
그리고 이것은 단지 시작일 뿐입니다.저는 이 신분증들을 어디든 가지고 다녀야 합니다.뉴스 피드를 저장하는 활동 클러스터가 있습니다.그게 당신이나 당신의 친구들이 하는 모든 행사입니다.얼마나 많은 공간이 필요한지 상상해보세요.
그리고 마침내 우리 엔지니어 중 한 명이 무의식적인 결정을 내리고 참조를 두 배 크기의 ObjectId를 나타내는 문자열로 저장하기로 결정했습니다.
인덱스가 RAM에 맞지 않으면 어떻게 됩니까?10gen은 좋은 것이 없다고 말합니다.
인덱스가 너무 커서 RAM에 들어가지 않을 경우 MongoDB는 디스크에서 인덱스를 읽어야 합니다. 이 작업은 RAM에서 읽는 작업보다 훨씬 느립니다.서버가 나머지 작업 세트와 함께 색인에 사용할 수 있는 RAM을 가지고 있을 때 색인이 RAM에 들어맞습니다.
즉, 읽기 속도가 느립니다.잠금 경합이 증가합니다.쓰기 속도도 느려집니다.80%-니쉬의 잠금 경합을 보는 것은 더 이상 충격적이지 않습니다.
어느새 460GB 클러스터가 구축되었고, 이를 하드로 분할해야 하며 조작하기가 상당히 어렵습니다.
페이스북은 64비트를 사용자 ID로 사용합니다 :) 이유가 있습니다.순차적 ID를 생성할 수 있습니다.
- 10gen의 조언을 이용하여.
- mysql을 카운터의 저장소로 사용(속도가 걱정되는 경우 핸들러 소켓을 살펴보십시오)
- 당신이 만든 ID 생성 서비스를 사용하거나 트위터의 Snowflake와 같은 것을 사용합니다.
그래서 여기 모든 사람들에게 드리는 제 일반적인 조언이 있습니다.당신의 데이터를 가능한 한 작게 만들어 주세요.여러분이 자랄 때, 그것은 여러분을 잠 못 이루는 많은 밤들을 구할 것입니다.
Josh, MongoDB에 자동 증분 ID가 없고 좋은 이유가 있습니다.클러스터에서 고유한 ObjectId를 사용합니다.
시퀀스 컬렉션에 의해 자동 증분을 추가하고 findAndModify를 사용하여 사용할 다음 ID를 가져올 수 있습니다.이렇게 하면 응용프로그램의 복잡성이 증가하고 데이터베이스를 공유하는 기능에도 영향을 미칠 수 있습니다.
생성된 ID가 고유하다는 것을 보장할 수 있는 한 괜찮습니다.하지만 두통은 거기에 있을 것입니다.
MongoDB 전용 Google 그룹에서 이 질문에 대한 자세한 내용을 보려면 다음 게시물을 참조하십시오.
이게 도움이 되길 바랍니다.
감사해요.
따라서, "자동 증가" ID에는 근본적인 문제가 있습니다.10개의 서로 다른 서버(MongoDB의 하드)가 있을 때, 누가 다음 ID를 선택합니까?
자동 증분 ID의 단일 세트를 사용하려면 해당 ID를 선택할 수 있는 단일 권한이 있어야 합니다.MySQL에서는 쓰기를 허용하는 서버가 하나뿐이므로 일반적으로 매우 쉽습니다.그러나 MongoDB의 대규모 배포는 이러한 "중앙 권한"이 없는 샤딩을 실행하고 있습니다.
MongoDB, 12바이트 사용ObjectIds
따라서 각 서버는 단일 권한에 의존하지 않고 고유하게 새 문서를 작성할 수 있습니다.
그래서 여기 큰 질문이 있습니다: "단 하나의 권한을 가질 수 있는 여유가 있습니까?
그렇다면 다음을 사용할 수 있습니다.findAndModify
"마지막 가장 높은 ID"를 추적한 다음 해당 ID로 삽입할 수 있습니다.
이것이 당신의 링크에 설명된 과정입니다.여기서 분명한 약점은 기술적으로 각 삽입에 대해 두 번의 쓰기를 수행해야 한다는 것입니다.이는 확장성이 좋지 않을 수 있으므로 삽입률이 높은 데이터에서는 사용하지 않는 것이 좋습니다.사용자에게는 효과가 있을 수 있으며, 클릭 추적에는 효과가 없을 수도 있습니다.
MongoDB에는 자동 증분과 같은 것은 없지만 필요에 따라 전용 컬렉션에 자신의 카운터를 저장하고 카운터의 관련 값을 $inc에 저장할 수 있습니다.$inc는 원자적 작업이므로 중복 항목을 볼 수 없습니다.
_id 필드에 사용된 기본 Mongo ObjectId가 증가하고 있습니다.
Mongo는 타임스탬프(Unix epoch 이후 몇 초)를 4-3-2-3 구성의 첫 번째 4바이트 부분으로 사용하며, 버전 1 UUID와 매우 유사합니다.삽입 시 ObjectId가 생성됩니다(사용자/클라이언트에서 제공한 다른 유형의 _id가 없는 경우).
따라서 ObjectId는 본질적으로 순서형이며 기본 정렬은 이 증분 타임스탬프를 기반으로 합니다.
많은 dbms에서 사용되는 자동 증분(index++) ID의 업데이트된 버전이라고 생각할 수 있습니다.
언급URL : https://stackoverflow.com/questions/6645277/should-i-implement-auto-incrementing-in-mongodb
'programing' 카테고리의 다른 글
사용을 종료하면 열려 있는 SQL 연결이 닫힙니다. (0) | 2023.06.03 |
---|---|
색의 16진수 투명도 (0) | 2023.06.03 |
npm 설치에서 충족되지 않는 종속성이 표시되는 이유는 무엇입니까? (0) | 2023.05.29 |
C#의 기본 생성자 - 어떤 것이 먼저 호출됩니까? (0) | 2023.05.29 |
스위프트로 로컬 비디오를 재생하는 방법은 무엇입니까? (0) | 2023.05.29 |