Замена последовательности на случайное число
Я хотел бы заменить некоторые последовательности, которые я использую для идентификаторов в моей базе данных postgresql, на свой собственный генератор идентификаторов. Генератор выдаст случайное число с контрольной цифрой в конце. Итак, это:
SELECT nextval('customers')
будет заменено что-то вроде этого:
SELECT get_new_rand_id('customer')
Функция будет затем возвращать числовое значение, такое как:[1-9][0-9]{9}
где последняя цифра является контрольной суммой.
Проблемы у меня есть:
Как сделать вещь атомнойКак мне избежать возвращения одного и того же идентификатора дважды (это будет замечено при попытке вставить его в столбец с уникальным ограничением, но потом, думаю, будет слишком поздно)Это хорошая идея вообще?Note1: Я не хочу использовать uuid, так как он должен сообщаться клиентам, и 10 цифр намного проще, чем 36-символьный uuid.
Заметка 2: Функция редко вызывается сSELECT get_new_rand_id()
но будет назначено в качестве значения по умолчанию в столбце id вместоnextval()
.
РЕДАКТИРОВАТЬХорошо, хорошие обсуждения ниже! Вот некоторые объясненияПочему:
Так с чего бы мне переусердствовать? Цель состоит в том, чтобы скрыть первичный ключ от клиентов.
Я даю каждому новому клиенту уникальный идентификатор клиента (сгенерированный серийный номер в БД). Так как я сообщаю этот номер клиенту, мои конкуренты довольно просто отслеживают мой бизнес (есть и другие номера, такие как номер счета-фактуры и номер заказа, которые имеют одинаковые свойства). Именно этот мониторинг я хотел бы сделать немного сложнее (примечание: не невозможно, но сложнее).
Почему чек?
Прежде чем говорить о сокрытии серийного номера, я добавил контрольную цифру в ordernr, так как в некоторых моментах производства были неповоротливые пальцы, и я думал, что это будет хорошей практикой, которую следует придерживаться в будущем.
Прочитав обсуждение, я, безусловно, вижу, что мой подход - не лучший способ решения моей проблемы, но у меня нет другой хорошей идеи о том, как ее решить, поэтому, пожалуйста, помогите мне здесь.
Должен ли я добавить дополнительный столбец, в который я помещаю идентификатор, который я предоставляю клиенту, и сохраняю серийный номер в качестве первичного ключа?Как я могу сгенерировать идентификатор, чтобы его можно было показывать разумным и эффективным способом?Нужна ли контрольная цифра?