2012-01-13 5 views
0

Я видел много дискуссий относительно этого. Я просто ищу ваши предложения по этому поводу. В основном, я использую PHP и MySQL. У меня есть таблица, в которой users идет:Композитные первичные ключи или суррогаты при работе с датой/временем

  users 
------------------------------ 
uid(pk) | username | password 
------------------------------ 
    12 | user1 | hashedpw 
------------------------------ 

и другую таблицу, которая хранит обновления пользователем

   updates 
-------------------------------------------- 
uid |  date   |  content 
-------------------------------------------- 
12 | 2011-11-17 08:21:01 | updated profile 
12 | 2011-11-17 11:42:01 | created group 
-------------------------------------------- 

страница профиля пользователя будет показывать 5 последних обновлений пользователь. На вопросы:

  1. Для updates таблицы, было бы возможно установить оба Uid и даты, как составные первичные ключи с UID ссылки UID из users
  2. ИЛИ было бы лучше просто создать другой столбец в updates, который автоматически увеличивает и будет использоваться в качестве первичного ключа (в то время как uid будет FK для uid в users)?

ответ

2

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

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

Что касается необычных первичных ключей: не делайте этого, он почти всегда появляется прямо на вашем лице, и вы должны сделать много работы, чтобы добавить правильный автоинкрементный ключ после этого.

+0

Вы абсолютно правы. Думаю, я тоже думал «по-человечески». Что хорошего в настройке таблицы? Какие-либо предложения? –

+1

'logid/uid/ts/eventtype/details' где' logid' - автоинкремент PK, 'ts' - столбец временной метки,' eventtype' является свободной формой, но короткий (varchar 16 chars), 'details' является свободной формой и не слишком длинный (varchar 1024). Разделение событий в типах + детали позволяет легко фильтровать «все логины», «все новые группы» и т. Д. – mvds

+0

Gotcha. Спасибо за помощь. –

0

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

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

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