2013-07-12 2 views
0

Таблица в базе данных MySQL содержит столбец для адресов электронной почты. В конечном итоге адреса электронной почты должны быть уникальными и иметь допустимые форматы. У меня возникли проблемы с выбором, где должна проводиться проверка и какая проверка необходима.Требуется уникальный адрес электронной почты

Очевидно, что только SQL не может полностью подтвердить адрес электронной почты, но я рассматривал возможность добавления ограничения NOT NULL, чтобы предотвратить отправку пустых адресов электронной почты. Поскольку каждый адрес электронной почты должен быть уникальным, делая столбец e-mail, уникальный ключ кажется разумным, но только потому, что столбец является уникальным ключом, не делает его NOT NULL право? Поскольку я, вероятно, буду проверять адрес электронной почты на сервере с помощью PHP, я мог бы просто проверить, нет ли там пустого места.

Критически важной частью информации, которую я делаю, является , добавляет ли уникальный ключ или ограничение, чтобы поиск выполнялся быстрее или медленнее??

Для столбца, содержащего адреса электронной почты, где не должно быть дубликатов и нет пустых строк/нулей и т. Д., Должно ли оно быть уникальным ключом и/или задано ограничение NOT NULL или что-то еще?

Я очень новичок в MySQL, поэтому образцы кода были бы полезны. У меня есть phpMyAdmin, если с ним проще работать.

Для уникального Я хотел бы использовать ALTER TABLE USER ADD UNIQUE INDEX(``e-mail``);
Для не нулевого я бы использовал ALTER TABLE user CHANGE ``e-mail`` varchar(254) NOT NULL;

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

+0

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

+0

Уникальное ограничение передает ваше намерение лучше, чем уникальный индекс. –

+0

@ MikeSherrill'Catcall 'какая разница? Согласно [здесь] (http://stackoverflow.com/questions/3245328/what-is-the-difference-between-unique-index-and-unique-key) термины являются синонимами. – Celeritas

ответ

1

Добавление уникального ограничения фактически ускорит поиск, поскольку оно будет индексировать таблицу в этом поле. Исходя из вашего описания проблемы, я думаю, что ваши заявления alter table верны.

1

Поля с уникальными индексами могут по-прежнему допускать нули. nulls никогда не могут быть равны ничему другому, включая себя, поэтому множественные NULL не являются нарушением ограничения уникальности. Однако вы можете запретить нули в поле, указав его как NOT NULL.

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

1

Ответ на этот вопрос хорош, и я бы рекомендовал использовать UNIQUE KEY и NOT NULL для вашего приложения. Использование UNIQUE KEY может замедлить INSERT или UPDATE, но это, безусловно, не замедлит поиск.

Однако, одна вещь, которую вы должны учитывать, заключается в том, что только потому, что вы используете UNIQUE KEY, она не обязательно обеспечивает соблюдение уникальных адресов электронной почты. Например, [email protected] и [email protected] представляют одно и то же электронное письмо. Если вы не хотите разрешать это, вы должны нормализовать адреса электронной почты в PHP, прежде чем отправлять их в свою базу данных.

+0

Не могли бы вы уточнить нормализацию адресов электронной почты? Возможно, было бы лучше отказаться от «UNIQUE KEY» и «NOT NULL» и сделать все на PHP. – Celeritas

+0

По нормализации я имел в виду удаление периодов в части имени пользователя электронной почты. Я не рекомендую утилизировать 'NOT NULL' и' UNIQUE KEY' из вашей базы данных. Даже если вы можете обеспечить все на уровне front-end, все еще есть много преимуществ, чтобы ваша схема выглядела так, как она должна быть. Например, если ваш PHP имеет ошибки в процессе проверки, это может привести к несогласованности в базе данных. Или когда другие люди разрабатывают другие части системы, они могут делать ненужные/ложные предположения, если они видят, что схема не применяет «UNIQUE KEY» или «NOT NULL». – cheeyos

0

С MySQL вы должны помнить, что уникальный индекс зависит от сортировки всей вашей таблицы (в других db вы можете сделать по функции upper()). См. Эту ссылку: http://sqlfiddle.com/#!2/37386/1 Теперь, если вы используете utf8_general_ci insted of utf8_bin, создание индекса не получится.

Смежные вопросы