Внутренний недостаток с идентификатором senquenced для таблицы SQL - это возможность для конечного пользователя легко перемещаться по всем вашим таблицам. Иногда это проблема.Каков наилучший способ избежать уникальных столкновений с учениями?
Одним из решений является создание непересекаемого идентификатора, что не допускается для каждой строки.
Этот идентификатор должен быть уникальным полем, очевидно. Я могу использовать случайную функцию для генерации thoses uniques ids для каждой строки, но есть вероятность, что она столкнется с ранее установленным id. Если он сталкивается, конечный пользователь будет воспринимать его как случайную ошибку ...
Вот одно простое решение, чтобы преодолеть эту проблему:
$keyValid = false;
while(!$keyValid) {
// Create a new random key
$newKey = generateKey();
// Check if the key already exists in database
$existingPotato = $em->getRepository('Potato')->findOneBy(array('key' => $newKey));
if (empty($existingPotato)) {
$keyValid = true;
}
}
// Hooray, key is unique!
Это заставляет меня сделать хотя бы один ЗЕЬЕСТ каждый раз я хочу новый идентификатор.
Итак, есть ли лучшее, общепринятое решение этой проблемы?
В качестве альтернативы, существует ли оптимизированная длина идентификатора, что делает эту проблему неуместной, делая вероятность столкновений несущественной (для таблицы из 3000 000 строк)?
им нехорошо с учением, но почему вы не используете идентификатор auto_increment? – ncm
Возможно ли генерировать нестрочные (шестнадцатеричные случайные) идентификаторы auto_increment? –
Вы ищете 'guid' или' uuid'? Большинство баз данных поддерживают такой тип. –