Я создаю таблицу в MariaDB для хранения значений cookie-файлов «запомнить меня»:
CREATE TABLE u_remember_me (
u_user_common_id INT UNSIGNED NOT NULL,
lookup_key VARCHAR(30) NOT NULL,
token_hash VARCHAR(30) NOT NULL,
created DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX (u_user_common_id),
FOREIGN KEY (u_user_common_id) REFERENCES u_user_common (id) ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY (lookup_key),
UNIQUE KEY (lookup_key, token_hash)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci ENGINE InnoDB;
Я всегда буду искать по полю lookup_key и поэтому выбрал его в качестве первичного ключа (случайная строка). Столбец u_user_common_id не может быть установлен в качестве первичного ключа, поскольку пользователю может быть назначено несколько (lookup_key, token_hash) из-за нескольких браузеров или компьютеров. Является ли lookup_key плохим выбором для первичного ключа (производительность, вставка и т. д.?). Также .. Должен ли я вместо этого установить первичный ключ на (lookup_key, token_hash) и отказаться от ограничения UNIQUE? Причина, по которой я решил не использовать суррогатный ключ, заключается в том, что он никогда не будет использоваться, но я не уверен, что это хорошее решение (мне все равно нужно индексировать lookup_key).
Вы заявляете, что «Я всегда буду искать по lookup_key», так что это все, что вам действительно нужно в индексе. Если вы не запрашиваете другие столбцы, вы можете просто использовать lookup_key в качестве единственного столбца в индексе, чтобы ваши индексы не стали слишком раздутыми.
Большое спасибо @MarcelloGrechiLins :) Также спасибо за подсказку о неправильном месте для публикации :) Извините за это! И тебе тоже спасибо, @RToyo! Я, вероятно, могу отказаться от ограничения UNIQUE, поскольку не имеет значения, имеют ли два пользователя одинаковый token_hash (даже если это маловероятно). Таким образом я могу сэкономить ненужное пространство для дополнительного индекса.






Думаю, вы не догадались, что от чего зависит.
Связан ли lookup_key (случайная строка) с одним пользователем? Если да, то PRIMARY KEY(lookup_key) и избавьтесь от token_hash.
Если пользователь может подключаться из разных браузеров а также, вы хотите, чтобы произошло что-то другое, значит, вы не указали какие-либо данные, которые будут отличаться.
Привет, @TankSneeze, добро пожаловать в Stack Overflow. Учитывая характер вашего вопроса, я считаю, что вам следует разместить его под dba.stackexchange.com, а не здесь.