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