Чтобы ответить на ваш вопрос, да, guid или uuid не предназначены для того, чтобы их было сложно предсказать. Он предназначен только для того, чтобы быть уникальным, что является достаточно сложной задачей.
Такие большие первичные ключи действительно занимают много места, что снижает производительность.
Я бы не рекомендовал это ни для чего, кроме крайней меры. Обычно люди будут использовать guid для ключей, когда они заранее планируют разбить данные на несколько таблиц.
Другой аргумент против этого - то, что обфускация не является безопасностью. Если есть проблема с точки зрения безопасности, когда кто-то видит что-то, чего им не следует, потому что он получил доступ, например, к URL-адресу с id=3
, то такая же проблема существует, если URL-адрес id=ae353c26-9022-11ea-b775-1866daed31d4
. Приложение не должно разрешать кому-либо доступ к id=3
, если они не должны иметь к нему доступ.
С учетом сказанного, один обходной путь, используемый для этого типа схемы, будет иметь sh ввод.
Вы можете использовать uuid, объединенный с некоторыми данными из строки, и, возможно, с меткой времени, и чем-то случайным, и, например, запустить это через sha1 (). Это создаст большую шестнадцатеричную строку из 40 символов.
Существует вероятность столкновения, поэтому вы, вероятно, захотите проверить и исправить это.
CREATE TABLE `myTable` (
`id` int(6) NOT NULL,
`first_name` varchar(64) NOT NULL,
`last_name` varchar(64) NOT NULL,
`GUID` char(40) NOT NULL,
PRIMARY KEY(`GUID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
DELIMITER //
CREATE TRIGGER `t_GUID` BEFORE INSERT ON `myTable`
FOR EACH ROW begin
SET new.GUID := (SELECT SHA1(CONCAT(new.first_name, RAND(), UUID(), new.last_name, NOW())));
END //
DELIMITER ;