автоинкремент id / эмуляция последовательности с CassandraDB / MongoDB и т. д. - PullRequest
9 голосов
/ 05 мая 2010

Я пытаюсь построить небольшую веб-систему (ярлык URL) с помощью nonsql Cassandra DB, проблема, которую я ставлю в стек, - это автоматическая генерация id.

Кто-то уже сложил с этой проблемой?

Спасибо.

P.S. UUID не работает для меня, мне нужно использовать ВСЕ числа от 0 до Long.MAX_VALUE (Java). поэтому мне нужно что-то, что точно работает, как sql sequence

ОБНОВЛЕНИЕ:

Причина, по которой я не согласен с идентификаторами GUID, находится в области действия моего приложения.

В моем приложении есть URL-адрес, и мне нужно сделать его как можно более коротким. Поэтому я придерживаюсь следующего подхода: я беру числа, начинающиеся с 0, и преобразую их в строку base64. Таким образом, в результате у меня есть url, как mysite.com/QA (где QA является строкой base 64).

Это было очень легко реализовать с использованием SQL DB, я просто взял автоматически увеличенный ID, преобразовал его в URL и был уверен на 100 процентов, что URL уникален.

Ответы [ 3 ]

4 голосов
/ 13 октября 2010

Не знаю насчет Кассандры, но с Монго вы можете иметь атомарную последовательность (она не будет масштабироваться, но будет работать так, как должна, даже в защищенной среде, если в запросе есть закрытое поле).

Это можно сделать с помощью команды findandmodify .

Давайте рассмотрим, у нас есть специальная коллекция с именем sequences, и мы хотим иметь последовательность для номеров сообщений (с именем postid), вы можете использовать код, подобный следующему:

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

Эта команда будет атомарно возвращать обновленный (new) документ вместе со статусом. Поле value содержит возвращенный документ, если команда выполнена успешно.

3 голосов
/ 05 мая 2010

Идентификаторы автоинкремента по своей сути плохо масштабируются, так как им нужен один источник для генерации чисел. Вот почему в осязаемых / реплицируемых базах данных, таких как MongoDB, используются более длинные GUID-подобные идентификаторы для объектов. Почему вам так нужны длинные значения?

Возможно, вы сможете сделать это с использованием атомарных приращений, сохранив старое значение, но я не уверен. Это будет ограничено только настройками одного сервера.

0 голосов
/ 05 мая 2010

Я не уверен, что следую за тобой. Какой язык вы используете? Мы говорим об uuid?

Ниже описано, как генерировать UUID на некоторых языках:

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

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