Sql Server использует DateTime в качестве первичного ключа - PullRequest
10 голосов
/ 23 февраля 2011

Привет, мои вопросы похожи на:

MySQL: использование DATETIME в качестве первичного ключа

Но я особенно заинтересован в Sql Server и хочу подойти к этому вопросу практически с конкретным сценарием, а не теоретически, как в другом посте.

Я хочу хранить события / действия, которые выполняют пользователи. Вероятность того, что более одного пользователя выполнят действие в одном и том же промежутке в 100 мс, очень мала, и нечастые столкновения являются приемлемыми. Если бы я мог дискретно выразить разрывы в 10 мс или даже 1 мс, тогда я очень доволен рисками.

Таким образом, возникает вопрос: могу ли я использовать DateTime в качестве моего первичного ключа вместо уникального идентификатора, потому что я буду регулярно запрашивать последние 100 событий и сортировать события по времени, когда они произошли.

Ответы [ 4 ]

3 голосов
/ 23 февраля 2011

Если вы действительно хотите избежать суррогатного ключа для этого (столбец идентификатора / идентификатора), я бы хотя бы объединил столбец datetime со столбцом идентификатора пользователя для составного ключа.Это звучит как более естественное соответствие вашим данным.

2 голосов
/ 23 февраля 2011

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

0 голосов
/ 23 февраля 2011

В SQL Server 2008 используйте DATETIME2, а не DATETIME.Вы можете достичь точности до 100 наносекунд в SQL Server 2008.

Если вам иногда нужно записать более одной строки за определенное время, хотя и нечасто, тогда я не уверен, чего вы пытаетесь достичь, делаядата и время в ключе.Важными критериями выбора ключей являются фамильярность, простота и стабильность.Исходя из этого, предполагая, что это имеет смысл для ваших требований, дата и время кажутся разумным выбором.

0 голосов
/ 23 февраля 2011

Чтобы нечастые коллизии были приемлемыми, вы действительно не можете использовать временную метку, поскольку будут коллизии.

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

Эта статья информативна по вопросам точности, специфичным для C #, однако.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...