2013-12-02 9 views
0

У меня есть таблицаДва уникальных ключей в таблице SQL

Users (Id, Uid, Name, Sex...). 

Id является Авто инкремент, Uid уникален, порожденный моим сценарием (сочетание шапки и nubers, 2X4TY).

Uid является общедоступным, я использую его в URL-адресах, в связи с клиент-сервером через JSON и т. Д. Я создал его также, чтобы скрыть внутренний Id, который в противном случае сказал бы людям, сколько у меня пользователей.

Я все время использовал Uid и даже начал использовать его как FK в других таблицах. Это хороший способ сделать это? Должен ли я отправлять Uid через JSON, а затем найти внутренний/автоинкремент Id и работать с ним? Это больше работы, и я смущен.

Может быть, мне просто не нужен автоинкремент Id, но меня учили в uni, что лучше всех таблиц иметь суррогатный ключ.

+1

Нет. Если uid не является (компонентом) ПК, не используйте его как FK в других таблицах. Кстати, вас учили неправильно. Суррогатный ключ не «лучше» или «хуже». Однако, если вы решите использовать суррогатный ключ, тогда, как правило, у вас также есть УНИКАЛЬНЫЙ натуральный ключ на одной или комбинации других столбцов в таблице. – Strawberry

+1

Мне кажется, что 'Uid' также является суррогатным ключом, нет? Кроме того, суррогат против естественных ключей - священная война, непонятно, что лучше, поэтому не стоит слишком много думать о том, чему вас учили. – Stijn

+0

Должен ли я сбросить идентификатор и использовать Uid в качестве PK или сохранить идентификатор, являющийся моим PK, и после получения Uid от клиента, найти соответствующий идентификатор и работать с ним? –

ответ

1

В общем, я считаю, что наличие первичных ключей с автоматическим увеличением является хорошей идеей.

Проблема знания «сколько у вас пользователей» не имеет значения. Нет причин включать первичный ключ в любое внешнее сообщение. У вас может быть ключ с автоинкрементами, но используйте uid для URL-адресов и подобных конструкций.

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

Если вы хотите уникальный ключ, который не автоинкремент, используйте функцию uuid(). Вы можете использовать универсальный идентификатор для маскировки идентификатора пользователя и количества пользователей, которые у вас есть.

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