Суррогат по сравнению с естественными/бизнес-[закрытыми] ключами

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

166
задан Peter Mortensen 16 September 2010 в 11:20
поделиться

14 ответов

Оба. Имейте свой пирог и съешьте его.

Помнят, что нет ничего специального о первичном ключе, за исключением того, что это маркировано как таковым. Это - не что иное как ограничение UNIQUE NOT NULL, и таблица может иметь больше чем один.

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

92
ответ дан Ted 23 November 2019 в 21:01
поделиться

Это - один из тех случаев, где суррогатный ключ в значительной степени всегда имеет смысл. Существуют случаи, где Вы или выбираете то, что является лучшим для базы данных или что является лучшим для Вашей объектной модели, но в обоих случаях, с помощью бессмысленного ключа или GUID лучшая идея. Это делает индексацию легче и быстрее, и это - идентификационные данные для Вашего объекта, который не изменяется.

2
ответ дан Michael Green 23 November 2019 в 21:01
поделиться

Суррогатные ключи могут быть полезными, когда бизнес-информация может измениться или быть идентичной. Названия компании не должны быть уникальными по всей стране, в конце концов. Предположим, что Вы имеете дело с двумя компаниями под названием Smith Electronics, один в Канзасе и один в Мичигане. Можно отличить их адресом, но это изменится. Даже состояние может измениться; что, если Smith Electronics Канзас-Сити, Канзас продвигается по реке в Канзас-Сити, Миссури? Нет никакого очевидного способа сохранить эти компании отличными с естественной ключевой информацией, таким образом, суррогатный ключ очень полезен.

Думают о суррогатном ключе как число ISBN. Обычно, Вы определяете книгу заголовком и автором. Однако у меня есть две книги, названные "Перл-Харбор" H. P. Willmott, и они - определенно различные книги, не только различные выпуски. В случае как этот я мог обратиться к взглядам книг, или ранее по сравнению с позже, но это точно также, у меня есть ISBN для возвращений.

2
ответ дан David Thornley 23 November 2019 в 21:01
поделиться

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

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

Бизнес-логика / естественные ключи может измениться, но физический ключ таблицы никогда не должен изменяться.

5
ответ дан user7658 23 November 2019 в 21:01
поделиться

На datawarehouse сценарии я верю, лучше для следования за путем суррогатного ключа. Две причины:

  • Вы независимы от исходной системы, и изменения там - такие как изменение типа данных - не будут влиять на Вас.
  • Вашему DW будет нужно меньше физического пространства, так как Вы будете использовать только целочисленные типы данных для своих суррогатных ключей. Также Ваши индексы будут работать лучше.
4
ответ дан Santiago Cepas 23 November 2019 в 21:01
поделиться

Суррогатные ключи довольно удобны, если Вы планируете использовать инструмент ORM для обрабатывания/генерирования классов данных. В то время как можно использовать составные ключи с некоторыми более усовершенствованными картопостроителями (чтение: будьте в спящем режиме), это добавляет некоторую сложность к Вашему коду.

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

я - поклонник использования uids для суррогатных ключей, когда подходящий. Главная победа с ними - то, что Вы знаете ключ заранее, например, уже можно создать экземпляр класса с идентификатором набор и гарантируемый быть уникальными, тогда как с, скажем, целочисленным ключом необходимо будет принять значение по умолчанию к 0 или-1 и обновить к соответствующему значению, когда Вы сохраните/обновите.

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

10
ответ дан Derek Lawless 23 November 2019 в 21:01
поделиться

Alway используют ключ, который не имеет никакого бизнес-значения. Это - просто хорошая практика.

РЕДАКТИРОВАНИЕ: Я пытался найти ссылку на него онлайн, но я не мог. Однако в 'Шаблоны Предприятия Archtecture' [Fowler] это имеет хорошее объяснение того, почему Вы ничего не должны использовать кроме ключа без значения кроме того, чтобы быть ключом. Это сводится к тому, что это должно иметь одно задание и одно задание только.

15
ответ дан Iain Holder 23 November 2019 в 21:01
поделиться

Суррогатный ключ никогда не будет иметь причины измениться. Я не могу сказать то же о естественных ключах. Фамилии, электронные письма, ISBN nubmers - они все могут измениться однажды.

31
ответ дан Rimantas 23 November 2019 в 21:01
поделиться

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

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

Думают Компании: Вы - счастливая компания Merkin, поддерживающая деловые отношения с другими компаниями в Merkia. Вы достаточно умны для не использования названия компании в качестве первичного ключа, таким образом, Вы используете уникальный идентификатор компании правительства Merkia в целом 10 алфавитно-цифровых символов. Тогда Merkia изменяет идентификаторы компании, потому что они думали, что это будет хорошая идея. Это в порядке, Вы используете каскадную функцию обновлений механизма своего дб, для разнообразия который не должен вовлекать Вас во-первых. Позже, Ваш бизнес расширяется, и теперь Вы работаете с компанией в Freedonia. Идентификатор компании Freedonian является до 16 символов. Необходимо увеличить идентификационный первичный ключ компании (также поля внешнего ключа в Заказах, Проблемах, MoneyTransfers и т.д.), добавив поле Country в первичном ключе (также во внешних ключах). Ай! Гражданская война в Freedonia, это разделяется в трех странах. Название страны Вашего партнера должно быть изменено на нового; каскадные обновления спасения. BTW, каков Ваш первичный ключ? (Страна, CompanyID) или (CompanyID, Страна)? Последний помогает соединениям, первый избегает другого индекса (или возможно многие, должны Вы хотеть свои Заказы, сгруппированные страной также).

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

31
ответ дан tzot 23 November 2019 в 21:01
поделиться

Кажется, что никто ничего еще не сказал в поддержку несуррогата (я смущаюсь говорить "естественный"), ключи. Таким образом, здесь идет...

А недостаток из суррогатных ключей - то, что они бессмысленны (процитированный в качестве преимущества некоторыми, но...). Это иногда вынуждает Вас присоединиться к намного большему количеству таблиц в свой запрос, чем должно действительно быть необходимым. Сравните:

select sum(t.hours)
from timesheets t
where t.dept_code = 'HR'
and t.status = 'VALID'
and t.project_code = 'MYPROJECT'
and t.task = 'BUILD';

против:

select sum(t.hours)
from timesheets t
     join departents d on d.dept_id = t.dept_id
     join timesheet_statuses s on s.status_id = t.status_id
     join projects p on p.project_id = t.project_id
     join tasks k on k.task_id = t.task_id
where d.dept_code = 'HR'
and s.status = 'VALID'
and p.project_code = 'MYPROJECT'
and k.task_code = 'BUILD';

, Если кто-либо серьезно не думает, следующее является хорошей идеей?:

select sum(t.hours)
from timesheets t
where t.dept_id = 34394
and t.status_id = 89    
and t.project_id = 1253
and t.task_id = 77;

, "Но" кто-то скажет, "что происходит, когда код для MYPROJECT или ДОПУСТИМЫЙ или HR изменяется?" К которому мой ответ был бы: "почему был бы Вы потребность для изменения его?" Это не "естественные" ключи в том смысле, что некоторое внешнее тело собирается издать законы, это впредь 'ДОПУСТИМОЕ' должно быть повторно кодировано как 'ХОРОШЕЕ'. Только небольшой процент "естественных" ключей действительно попадает в ту категорию - SSN и почтовый индекс, являющийся обычными примерами. Я определенно использовал бы бессмысленный числовой ключ для таблиц как Человек, Адрес - но не для [1 113] все , который по некоторым причинам большинство людей здесь, кажется, защищает.

См. также: мой ответ на другой вопрос

68
ответ дан Community 23 November 2019 в 21:01
поделиться

Всего несколько причин использования суррогатных ключей:

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

  2. Соглашение : Позволяет Вам иметь стандартизированное соглашение о присвоении имен столбца Primary Key вместо того, чтобы иметь необходимость думать о как к объединяющим таблицам с различными названиями их PKs.

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

118
ответ дан Jay Shepherd 23 November 2019 в 21:01
поделиться

Используя суррогатный ключ лучше, по-моему, поскольку существует нулевой шанс его изменение. Почти что-либо, о чем я могу думать, который Вы могли бы использовать в качестве естественного ключа, могло измениться (правовая оговорка: не всегда верный, но обычно).

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

6
ответ дан Mark Embling 23 November 2019 в 21:01
поделиться

В случае момента времени база данных лучше иметь комбинацию суррогатных и естественных ключей. например, необходимо отследить информацию об участнике для клуба. Некоторые атрибуты участника никогда не изменяются. например, Дата рождения, но имя может измениться. Поэтому создайте Таблицу-участник с member_id суррогатным ключом и имейте столбец для DOB. Составьте другую таблицу, названную именем человека, и имейте столбцы для member_id, member_fname, member_lname, date_updated. В этой таблице естественный ключ был бы member_id + date_updated.

0
ответ дан 23 November 2019 в 21:01
поделиться

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

Вот мои причины:

  1. При использовании естественных ключей таблицы группируются наиболее часто выполняются поиск, что ускоряет выполнение запросов.

  2. При использовании суррогатных ключей вы должны добавить уникальные индексы в столбцы логических ключей. Вам по-прежнему необходимо предотвратить логическое дублирование данных. Например, вы не можете разрешить две организации с одинаковым именем в вашей таблице организации, даже если pk является столбцом суррогатного идентификатора.

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

  4. В цепочках отношений от одного до многих - цепочки логических ключей. Так, например, у организаций много счетов, а у счетов много счетов-фактур. Таким образом, логический ключ организации - это OrgName. Логический ключ учетных записей - это OrgName, AccountID. Логическим ключом Invoice является OrgName, AccountID, InvoiceNumber.

    Когда используются суррогатные ключи, цепочки ключей усекаются только за счет наличия внешнего ключа для непосредственного родителя. Например, в таблице Invoice нет столбца OrgName. В нем есть только столбец для AccountID. Если вы хотите найти счета-фактуры для данной организации, вам нужно будет присоединиться к таблицам Организация, Учетная запись и Счет-фактура. Если вы используете логические ключи, вы можете напрямую запросить таблицу организации.

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

  6. У меня есть три разные книги баз данных. Ни в одном из них не показано использование суррогатных ключей.

25
ответ дан 23 November 2019 в 21:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: