Автоматически генерировать ID при добавлении нового документа

Мой проект использует базу данных ClusterPoint, и мне интересно, возможно ли вставить документ в базу данных со случайно назначенным идентификатором.

Кажется, в этом документе указан «ID» но что, если он уже существует? Есть ли лучший способ генерировать уникальные идентификаторы.

2

Решение

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

try {
// Begin transaction
$cpsSimple->beginTransaction();
// Retrieve sequence document with id "sequence"$seq_doc = $cpsSimple->retrieveSingle("sequence", DOC_TYPE_ARRAY);
//in sequence doc we store last id in field 'last_doc_id'
$new_id = ++$seq_doc['last_doc_id'];
$cpsSimple->updateSingle("sequence", $seq_doc);
//commit
$cpsSimple->commitTransaction();
//add new document with allocated new id
$doc = array('field1' => 'value1', 'field2' => 'value2');
$cpsSimple->insertSingle($new_id, $doc);
} catch (CPS_Exception $e) {

}
1

Другие решения

Я решил, пытаясь заново вставить данные, если исходная операция не удалась. Вот мой метод в PHP:

function cpsInsert($cpsSimple, $data){
for ($i = 0; $i < 3; $i++){
try {
$id = uniqid();
$cpsSimple->insertSingle($id, $data);
return $id;
}catch(CPS_Exception $e){
if($e->getCode() != 2626) throw $e;

// will go for another attempt
}
}
throw new Exception('Unable to generete unique ID');
}

Я не уверен, что это лучший подход, но он работает.

1