Первичные ключи MySQL Table - PullRequest
       6

Первичные ключи MySQL Table

2 голосов
/ 25 августа 2009

Привет,

У меня есть несколько таблиц mysql, которые в настоящее время используют хэш md5 в качестве первичного ключа. Я обычно генерирую хэш со значением столбца. Для примера давайте представим, что у меня есть таблица под названием «Исполнители» с полями id, name, num_members, year. Я стараюсь сделать md5 ($ name) и использовать его с идентификатором.

Я хотел бы знать, каковы недостатки этого. Просто лучше использовать целые числа с AUTO_INCREMENT? Я склонен убегать от этого, потому что просто не стоит выяснять, какой последний идентификатор был вставлен, а что будет следующим и т. Д.

Можете ли вы дать мне немного света на этом?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 25 августа 2009

Кажется, что способ, которым вы пытаетесь использовать MD5, на самом деле не приносит вам никакой выгоды. Если «$ name» уникально, то почему бы просто не использовать «name» в качестве первичного ключа? Вычисление хеша MD5 и использование его в качестве ключа для чего-то уже уникального является излишним.

С другой стороны, если «имя» не уникально, то хеш MD5 также не будет уникальным, и поэтому бессмысленно и в этом случае.

Обычно вы используете хеш MD5, когда не хотите сохранять фактическое значение столбца. Например, если вы храните пароли, вы, как правило, храните только хеш-пароль MD5, а не сам пароль, поэтому вы не можете видеть пароли людей, просто взглянув на содержимое таблицы.

Если у вас нет уникальных полей, то вы застряли, делая что-то вроде автоинкремента, потому что это по крайней мере гарантировано уникальное. Если вы используете встроенный автоинкремент SQL, то вам просто нужно получить последний, так или иначе. С другой стороны, если вы можете избежать использования локального уникального счетчика в вашем приложении, это избавляет от необходимости использовать автоинкремент, но не всегда жизнеспособно для большинства приложений.

2 голосов
/ 25 августа 2009

Если вам нужен суррогатный первичный ключ , использование поля AUTO_INCREMENT лучше, чем хеша md5, поскольку оно содержит меньше байтов данных, а серверные части базы данных оптимизируются для целочисленных первичных ключей.

mysql_insert_id можно использовать, если вам нужен последний вставленный идентификатор.

Если вы генерируете первичный ключ как хэш других столбцов, почему бы просто не использовать эти другие столбцы в качестве уникального ключа, а затем присоединиться к ним?

Другой вопрос: каковы преимущества использования хеша md5? Я не могу думать ни о чем.

2 голосов
/ 25 августа 2009

У первого подхода есть один очевидный недостаток: если есть два художника с одинаковыми именами, будет столкновение первичного ключа. Использование столбца INT с автоинкрементом обеспечит уникальность.

Более того, хотя и очень маловероятно, существует вероятность того, что MD5-хэши с различными строками могут столкнуться (я, кажется, вспоминаю вероятность как 1 к 36 с степенью 32).

2 голосов
/ 25 августа 2009

MD5 не является истинным ключом в этом случае, потому что он функционально зависит от имени. Это означает, что если у вас есть два исполнителя с одинаковыми именами, у вас есть дубликаты «ключей» для разных записей. Вы можете сделать его реальным ключом, хешируя все атрибуты вместе (и надеясь, что боги вероятности не отправят вам столкновение), или вы можете просто избавить себя от проблем и использовать автоинкрементный идентификатор.

0 голосов
/ 25 августа 2009

Преимущества состоят в том, что если вы предоставляете идентификаторы клиентам (скажем, в строке запроса для веб-формы, хотя это другое нет-нет) ... это не позволяет пользователям угадать другой.

Лично я использую автоинкремент без проблем (переместил БД на новые серверы и все без проблем)

...