У меня есть база данных карт TCG, и я пытаюсь решить первичный ключ. Сначала я поселился с суррогатным ключом, но я понял, что иногда есть карточки, которые я забываю добавить, например, промо-карты. Это проблема с суррогатным ключом, потому что они добавляются в базу данных с самым последним автоматическим приращением, и я не хотел, чтобы их идентификаторы зависели от того, в каком порядке они были вставлены. Я думал, может быть, я могу сделать хэш на некоторых функциях карты и использовать это как первичный ключ вместо этого?crc32 натурального ключа в качестве первичного ключа
Возьмем, например, следующий псевдокод:
// set code, date released, collector number, name
$crc = crc32(implode(',', ['A', '1993-08-03', '232a', 'black lotus']));
echo $crc; // 4199975187
Возможное количество карт парит только около 25k сейчас и растет около 100-300 каждые 6 месяцев.
- У этого курса не будет столкновения справа?
- Это хорошая практика? Есть ли у меня другие хорошие альтернативы?
Я знаю, что может сделать хэш короче, преобразовав его в base 62
, но я буду присоединяться к этим запасам столу пользователей, так что я думаю, поддерживая их в int
будет лучшим вариантом.
В целом, «интеллектуальный ключ» (такой как ключ, созданный из конкатенированных столбцов), является идеей _bad_. Не могли бы вы объяснить, почему «суррогатный ключ» не решает вашу проблему? Ключ - это просто уникальный номер, как это важно, если значение ключа также соответствует порядку вставки? – hashbrown
Этот идентификатор будет отображаться для пользователей, просматривающих приложение. Скорее всего, в параметре $ _GET. Я не хотел, чтобы они догадывались о том, какие карты были вставлены в базу данных на основе идентификаторов, которые у них были. – voldomazta
Почему порядок вставки относится к конечному пользователю? Это не похоже на то, что вы раскрываете имена таблиц или настоящие секреты. Большинство веб-приложений используют идентификаторы для ключей. Большой процент раскрывает эти ключи где-то. Это неважно. – Tim