2013-03-06 6 views
1

그래서 문제가 발생합니다. 나는 그들이 제공되고있는 데이터에 기반하여 "예쁜"URL을 생성하려고하는 서버를 가지고있다. 토론을 위해 블로그 게시물의 제목을 말하게 할 수 있습니다. 이것에 대한 URL은 자원을 적절히 표현할 때 분명히 고유해야합니다. 글쎄, 내가 틀렸다면 정정해라. 그러나 이것은 MongoDB에서 간단한 문제가 아니다?고유 URL 생성

처음에는 자동 증가 필드가 검색됩니다. 이것은 내가 예상 한 것을 되 돌렸지 만 눈부신 문제가있었습니다. 10gen은 이에 대해 조언합니다. 이 문서의 큰 숫자 데이터베이스에 대한 확장하지 않기 때문에 MongoDB를 일반적으로 경고

, 당신은 _id 필드, 또는 필드에 대한 자동 증가 패턴을 사용하지 않을 것입니다. 일반적으로 ObjectId의 기본값은 _id에 더 이상적입니다.

굵은 글씨에 유의하십시오. 10gen은 어떤 필드를 증가 시키라고 조언하지 않습니다.

그래서 문제로 돌아갑니다. 서버에 게시물 제목을 건네고 게시물을 만들려면 자동으로 제목을 고유 한 제목으로 변경해야합니다. 예를 들어, 제목이 foo 인 게시물을 세 개 만들면 서버에서 /foo, /foo1, /foo2에 대한 URL을 만들길 원합니다. 그것은 독특한 형태의 추가 형태 일 수 있지만, 여기에 요점은 서버가 단순히 고유 한 URL을 만들기 위해 반복적으로 실패하고 실패하게 만드는 것이 아니라 고유 한 URL을 만드는 더러운 작업을 처리한다는 것입니다.

이렇게 말하면 "MongoDB 방식"에서 어떻게 이루어 집니까? 10gen은 에 대해가 증가한다고 말하지만, 기본적으로 유일한 고유 문자열은 ObjectID입니다. 그러나 /foo50bbe1573b60ff0000000002은 거의 "꽤"입니다. /foo50bbe1573b60ff0000000002을 사용해야 만한다면 /50bbe1573b60ff0000000002을 사용할 수도 있습니다. "예쁜"은 처음 5 자 후에 오랫동안 사라졌습니다.

MongoDB 친숙한 방식으로이 문제를 처리하는 방법에 대한 의견이나 의견이 있으십니까?

잠재 응답 : 유일한 끔찍한 해결책은 고유 패스가 될 때까지 문서 생성을 반복하는 것이지만 최대 X 회입니다. 즉이 실패하면

  • 제목 플러스 OBJECTID 의 증가 값 (예를 들어, 00002)로 쓰기 실패 할 경우 예를 들어,

    1. 당신은 그것을 쓰기, 제목
    2. 함께 쓰기 시도 할 수 전체 신과 지옥. 우리는 이미이 시점에서 이미 길을 잃었습니다.

    잠재적 답 : 증분 필드를 만드는에 대해 조언 무엇 10gen 또 다른 잠재적 인 대답은 간단하고있다.

    위의 두 가지 해결책 중에서 각 방법이 다양 할 때 더 효율적이라고 확신합니다. 예 : 솔루션 1은 고유 한 필드가 고유 할 가능성이 매우 높을 때 가장 좋습니다 (예 : 40 자의 사용자 입력 데이터). 네 글자를 다루는 경우 당밀로 느려질 수 있습니다.

    편집 : 더 나은 답변 두 조합이 가장 좋을 것이라고 생각합니다. (예 : /foo)의 "원본"URL 모음을 몇 번이나 작성했는지 확인하십시오. 타겟 URL에 카운트를 추가하면 고유 URL이 생깁니다. 나는 이것이 10gen이 권고하는 성능 문제들 사이의 균형이 될 것이며, 여전히 당신에게 증가를 제공한다고 믿습니다.

  • +2

    가장 친숙한 솔루션 인 foo, foo1, foo2를 소개 한 이유를 이해하지 못해서 비우호적 인 16 진수 문자열에 대해 이야기했습니다. 대답은 다음과 같습니다. URL에있는 슬러그를 사용하여 게시물을 찾을 때 슬러그를 생성 할 때 고유성을 빠르게 확인하고 게시물에 가입 할 수있는 친숙한 슬러그 테이블을 만듭니다. – Popnoodles

    +0

    foo1/2/3 등은 모든 형태로 증가합니다. 10gen이 * 그에 대한 조언 * –

    +1

    "일반적으로 MongoDB에서는 자동 증가 패턴을 사용하지 않을 것입니다."**! = ** "가장 현명한 해결책을 사용하지 마십시오." – Popnoodles

    답변

    4

    10gen은 일종의 비관적 동시성을 배치하거나 서버 측 javascript를 사용하여 ENTIRE 컬렉션의 현재 최대 키를 찾은 다음이를 증가시키고 새 _id를 반환하는 것에 대해 경고합니다. MongoDB는 불에 의존하고 삽입/업데이트를 잊어 버리는 거대한 콜렉션을 위해 설계되었습니다. 설명하는 응용 프로그램의 특성상 이러한 문제 중 하나도 장애가됩니다 (10gen의 조언보다는 문제 도메인에 대한 지식과 이것이 경고에 대한 항목과 상호 작용하는 방법).

    10gen의 조언에 가지 않는 더 나은 방식은 포스트의 다른 속성에서 URL을 구성하는 것에서 등 사용자 이름,이 생성 된 날짜와 시간,

    을 즉 당신의 블로그 게시물의 예를 들어, 당신은

    /글/사용자 이름과 같이/2013/3/5/타이틀의-내 포스트를 찾아 URL 경로가있을 수 있습니다

    당신은 결정해야합니다 표시중인 리소스의 속성을 기반으로 한 실제 스키마 그러나 그것은 좋은 시작이다. 이 예에서 한 명의 사용자가 같은 날 제목이 같은 두 개의 게시물을 만들지 않으면 고유 한 URL을 보장하는 데 아무런 문제가 없습니다. 이 경우 귀하의 문서를 보일 수 있습니다 같은 :

    { _id : ObjectId가 (...), 아이디 : '사용자 이름', dateCreated : ISODate ("2013년 3월 5일"), 제목 : , 몸 "내 게시물의 제목": "..." } {dateCreated: -1, userName: 1, title: 1}에 고유 인덱스와

    (이 분류에 멋지게을 설정하고 또한, 사용자가 게시물을 주문한 것이다).

    +1

    "하지만 몇 년과 몇 달은 증분입니다." +1 현명한 대답. – Popnoodles

    +1

    WordPress가하는 것처럼 조금 생겼고 복제본을 받으면 시퀀스를 추가합니다. –

    +0

    그들이 조언을 말한 방식에 관한 재미있는 점은 인덱스 최적화를 더 깊이 파헤 치면 인덱스에 점진적으로 항목을 삽입하는 것이 중요하다는 것입니다. 나는 거의 모든 사람들이 새로운 레코드를 삽입하기 전에 이전의 max 키를 찾기 위해 여전히 테이블에서 선택하는 정말로 오래된 학교 SQL 개발자에게 경고하기를 바란다. – marr75