Мне нечего сказать о вашем анализе. Если я сократил некоторые ваши плюсы или минусы, это означает, что я не думаю, что мне есть что добавить.
Идентификационный столбец
Плюсы
- Нет делового значения (стабильный первичный ключ)
- быстрое соединение таблиц
- индекс сжатия
Во-первых, любой объявленный столбец или набор столбцов NOT NULL UNIQUE имеют все свойства первичного ключа. Вы можете использовать любой из них в качестве цели для ссылки на внешний ключ, о чем все это действительно .
В вашем случае ваша структура позволяет 4 столбцам быть целью ссылки на внешний ключ: идентификатор, имя пользователя, адрес электронной почты и external_customer_id. Вам не нужно использовать один и тот же все времени. Возможно, имеет смысл использовать идентификатор для 90% ваших ссылок на FK и электронное письмо для 10% из них.
Стабильность не имеет никакого отношения к тому, имеет ли столбец деловой смысл. Стабильность связана с тем, как часто и при каких обстоятельствах ценность может меняться. «Стабильный» не означает «неизменный», если вы не используете Oracle. (Oracle не может сделать ОБНОВЛЕНИЕ КАСКАДА.)
В зависимости от структуры таблицы и индексации естественный ключ может работать быстрее. Природные ключи делают некоторые соединения ненужными. Я сделал тесты, прежде чем я построил нашу производственную базу данных. Вероятно, пройдут десятилетия, прежде чем мы достигнем того, что объединения по идентификационным номерам превзойдут меньшее количество объединений и естественных ключей. Я писал об этих тестах либо на SO, либо на DBA.
У вас есть три других уникальных индекса. ( Хорошо для вас. Я думаю, что по крайней мере 90% людей, которые создают базу данных, не понимают этого правильно.) Так что не только индекс на идентификационном номере является более компактным, чем любой из них. три; это также дополнительный индекс. (В этой таблице.)
столбец электронной почты
Плюсы
Адрес электронной почты можно считать стабильным и уникальным. Вы не можете помешать людям делиться адресами электронной почты, независимо от того, является ли она целью ссылки на внешний ключ.
Но адреса электронной почты могут быть "потеряны". В США большинство студентов университетов теряют свои адреса электронной почты * .edu примерно через год после выпуска. Если ваш адрес электронной почты поступает через домен, за который вы платите, и вы прекращаете платить, адрес электронной почты исчезает. Я полагаю, что такие адреса электронной почты могут быть предоставлены новым пользователям. Создает ли это невыносимое бремя, зависит от приложения.
Против
- пользователь должен иметь возможность изменить адрес электронной почты. Не подходит для первичного ключа
Все значения в базе данных SQL могут быть изменены. Это только не подходит, если ваша среда не позволяет вашим dbms своевременно выполнять декларацию ON UPDATE CASCADE. Моя среда делает. (Но я запускаю PostgreSQL на приличном неразделенном оборудовании.) YMMV.
имя пользователя столбец
За
- "естественный" первичный ключ
- Меньше объединений таблиц
- более простые и более "естественные" запросы
Меньше объединений - важный момент. Я был на консультациях, где видел бессмысленное использование идентификационных номеров, заставляющих людей писать запросы с 40+ объединениями. Разумное использование натуральных ключей исключено до 75% из них.
Не важно всегда использовать суррогатные ключи в качестве цели для ваших внешних ключей (кроме Oracle) или всегда использовать естественные ключи в качестве цели. Важно думать.
Против
- столбец varchar медленнее при объединении таблиц
- индекс столбца varchar менее компактен, чем индекс столбца int
Вы не можете сказать, что присоединение к varchar () происходит медленнее, без проверки этого утверждения. Дело в том, что, хотя большинство объединений в varchar () медленнее , чем объединения в идентификаторах, они не обязательно настолько медленны, что их нельзя использовать. Если запрос занимает 4 мс с номерами идентификаторов и 6 мс с varchar (), я не думаю, что это хорошая причина для дисквалификации varchar (). Кроме того, использование естественного ключа устранит множество соединений, поэтому общий отклик системы может быть быстрее. (При прочих равных условиях 40 соединений по 4 мс будут хуже, чем 10 соединений по 6 мс.)
Я не могу вспомнить ни одного случая в моей карьере базы данных (более 25 лет), когда ширина индекса была решающим фактором при выборе цели для внешнего ключа.
колонка external_customer
профи
- может использоваться как внешняя ссылка для клиента и не содержит никакой информации (может быть, вместо этого можно использовать нередактируемое имя пользователя?)
На самом деле существует несколько систем, которые позволяют мне менять свое имя пользователя. Большинство позволит мне изменить свое настоящее имя (я думаю), но не мое имя пользователя. Я думаю, что не редактируемое имя пользователя вполне разумно.