Зачем использовать автоинкрементный первичный ключ, когда существуют другие уникальные поля? - PullRequest
47 голосов
/ 05 ноября 2010

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

Вот пример таблицы, которую я создал:

CREATE TABLE users
(
  uid INT NOT NULL AUTO_INCREMENT,
  username VARCHAR(60),
  passhash VARCHAR(255),
  email VARCHAR(60),
  rdate DATE,
  PRIMARY KEY(uid)
);

Профессор сказал мне, что "uid" (идентификатор пользователя) совершенно бесполезен и ненужен, и я должен был использовать имя пользователя в качестве первичного ключа, поскольку никакие два пользователя не могут иметь одинаковое имя пользователя.

Я сказал ему, что мне удобно использовать идентификатор пользователя, потому что, когда я вызываю что-то вроде domain.com/viewuser?id=5, я просто проверяю параметр с помощью: is_numeric($_GET['id']) ... само собой разумеется, он не был убежден .

Поскольку я видел user_id и другие подобные атрибуты (thread_id, comment_id и др.) Во множестве учебных пособий и рассмотрении схемы базы данных популярного программного обеспечения (например, vbulletin), должно быть множество других (более веских) причин.

Итак, мой вопрос: как бы вы обосновали необходимость ненулевого автоматического увеличения идентификатора в качестве первичного ключа по сравнению с использованием другого атрибута, такого как имя пользователя?

Ответы [ 12 ]

0 голосов
/ 05 ноября 2010

мы используем ID для предотвращения дублирования данных, и это может сделать некоторые процедуры не сложными (если мы хотим обновить или удалить данные), это будет проще, если мы используем ID.

, если вы не хотите использоватьID вы можете использовать другие поля.но не забудьте сделать их уникальными.это может сделать ваши данные превентивными от дублирования данных.

другой выход за пределы PRIMARY - УНИКАЛЬНЫЙ.

0 голосов
/ 05 ноября 2010

Например, целочисленный поиск (? Id = 5) намного быстрее и имеет большую мощность, чем поиск строк (? Username = bob). Другой пример, uid - auto_increment, поэтому вам не нужно вставлять его явно, но он будет автоматически увеличиваться при каждом запросе вставки.

PS: Ваш проф так ошибается: D

...