2010-05-05 3 views
9

nonsql Cassandra DB를 사용하여 작은 웹 시스템 (URL 단축키)을 만들려고합니다.이 스택은 id 자동 생성 문제입니다.CassandraDB/MongoDB 등을 사용하여 id autoincrement/sequence 에뮬레이션

누군가 이미이 문제로 쌓인 적이 있습니까?

감사합니다.

P. UUID가 작동하지 않습니다. 0에서 Long.MAX_VALUE (java)까지의 모든 숫자를 사용해야합니다.

내가 GUID의 ID가 확인 아니에요 이유는 내 응용 프로그램의 범위 안에 : 그래서 정확히 SQL 순서 업데이트]

처럼 작동 뭔가가 필요 없습니다.

내 응용 프로그램의 URL이 shortcutting하고 가능한 한 짧게 만들 필요가 있습니다. 그래서 나는 다음 접근법을 따른다. 나는 0부터 시작하여 숫자를 base64 문자열로 변환한다. 따라서 결과에는 mysite.com/QA (QA는 기본 64 문자열)와 같은 URL이 있습니다.

이것은 SQL DB를 사용하여 구현하기가 매우 쉽습니다. 자동 증분 ID를 가져 와서 URL로 변환하고 URL이 100 % 확실하다는 것을 알았습니다.

+0

UUID를 사용할 수없는 이유와 nonsql-databases를 사용해야하는 이유를 자세히 설명하십시오. 어쩌면 우리는 당신의 문제를 다른 방법으로 해결할 수 있습니다. – Espo

답변

3

자동 증가 ID를 본질적으로 확장 성이 좋지 않습니다

다음

는 일부 언어에서 UUID를 생성하는 방법이다. 이것이 MongoDB와 같은 공유 가능/복제 가능 데이터베이스가 더 긴 GUID와 같은 객체 식별자를 사용하는 이유입니다. 왜 LONG 값이 그렇게 심하게 필요합니까?

이전 값을 유지하면서 원자 단위로 증가시킬 수도 있지만 확실하지 않습니다. 이는 단일 서버 설정에만 제한됩니다.

+0

내 문제의 소스를 잘 이해해 주셔서 감사합니다. 업데이트 된 질문 설명을 확인하십시오. 감사합니다. – abovesun

+0

연속적이어야합니까? "1..MAX (LONG)에서 임의의 숫자를 선택하고 삽입"은 어떻습니까? 필드에 고유 색인이 있는지 확인하십시오. 삽입에 실패하면 다른 임의의 값으로 다시 시도하십시오. 이것은 원자 적이며 안전합니다. 그리고 DB 크기가 2^31 근처에 가지 않는 한 꽤 효율적입니다. – wump

+0

예, 아마도이 접근법이 저에게 그렇게 나쁘지는 않습니다. 진실이라고 말하면 카산드라는 SQL 고유의 제약 조건과 유사합니다. 적어도 그것을 모방하는 방법을 찾지 못했습니다. 하지만 난 아직 열심히 노력하지 않았다 :) – abovesun

-1

나는 잘 모르겠다. 어떤 언어를 사용하고 있습니까? 우리는 Uuid에 대해 이야기하고 있습니까? 그들은 숫자를 생성하는 단일 소스를 필요로하는

java.util.UUID.randomUUID(); // (Java) variant 2, version 4 

import uuid // (Python) 
uuid.uuid1() // version 1 
+0

UUID가 작동하지 않습니다. 0에서 Long.MAX_VALUE (java)까지의 모든 숫자를 사용해야합니다. 그래서 난 정확히 SQL 시퀀스처럼 작동 무언가가 필요합니까 – abovesun

4

카산드라에 대해 잘 모르겠지만 mongo를 사용하면 원자 시퀀스를 가질 수 있습니다 (규모가 커지지는 않지만 쿼리에 샤드 된 필드가있는 경우 샤르드 환경에서도 작동해야합니다).

findandmodify 명령을 사용하여 수행 할 수 있습니다.

 
> db.runCommand({ "findandmodify" : "sequences", 
        "query" : { "name" : "postid"}, 
        "update" : { $inc : { "id" : 1 }}, 
        "new" : true }); 

이 명령은 원자 적 갱신 반환합니다

,이 유사한 코드를 사용할 수의 우리가 sequences라는 이름의 특별 징수를 생각해 보자 우리는 (postid 이름) 게시 번호의 순서를 갖고 싶어 (new) 상태와 함께 문서. value 필드에는 명령이 성공적으로 완료되면 리턴 된. 서가 들어 있습니다.