Нет первичного ключа или суррогатного ключа? - PullRequest
1 голос
/ 23 ноября 2011

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

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

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

Мы используем SQL Server 2008 R2.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2011

Если у вас нет веских причин поступить иначе, по умолчанию в вашей структуре базы данных используется суррогатный первичный ключ с использованием smallint / int / bigint в зависимости от обстоятельств с набором свойств IDENTITY, чтобы он генерировал автоматически созданные значения первичного ключа. Если позже вы решите, что хотите принудительно использовать естественный ключ, используя один или несколько столбцов в таблице, вы можете сделать это, создав УНИКАЛЬНОЕ ОГРАНИЧЕНИЕ.

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

0 голосов
/ 23 ноября 2011

Так что же означает таблица с такими строками?

customer_id                           data_point     time_entered
--
6F9619FF-8B86-D011-B42D-00C04FC964FF  some data      2011-11-23 10:02:12.34567
6F9619FF-8B86-D011-B42D-00C04FC964FF  some data      2011-11-23 10:02:12.34567
6F9619FF-8B86-D011-B42D-00C04FC964FF  some data      2011-11-23 10:02:12.34567

А что означает таблица с такими строками, как , это ?

id  customer_id                           data_point     time_entered
--
1   6F9619FF-8B86-D011-B42D-00C04FC964FF  some data      2011-11-23 10:02:12.34567
2   6F9619FF-8B86-D011-B42D-00C04FC964FF  some data      2011-11-23 10:02:12.34567
3   6F9619FF-8B86-D011-B42D-00C04FC964FF  some data      2011-11-23 10:02:12.34567

Если у вас нет хорошего ответа на первый вопрос до того, как вы повесите идентификационный номер на эту таблицу, у вас тоже не будет хорошего ответа потом.

...