Большинство обычно используемых механизмов (MS SQL Server, Oracle, DB2, MySQL и т. Д.) Не испытывают заметных проблем при использовании системы суррогатных ключей. Некоторые могут даже испытать повышение производительности от использования суррогата, но проблемы с производительностью сильно зависят от платформы.
В общих чертах, естественный ключ (и, следовательно, составной ключ) в стихах о суррогатных ключевых дебатах имеет долгую историю, и в поле зрения, скорее всего, нет «правильного ответа».
Аргументы для естественных ключей (единственного или составного) обычно включают в себя следующее:
1) Они уже доступны в модели данных. Большинство моделируемых объектов уже содержат один или несколько атрибутов или комбинаций атрибутов, которые удовлетворяют потребности ключа в целях создания отношений. Добавление дополнительного атрибута к каждой таблице включает ненужную избыточность.
2) Они устраняют необходимость в определенных объединениях. Например, если у вас есть клиенты с кодами клиентов и счетами с номерами счетов (оба из которых являются «естественными» ключами), и вы хотите получить все номера счетов для определенного кода клиента, вы можете просто использовать "SELECT InvoiceNumber FROM Invoice WHERE CustomerCode = 'XYZ123'"
. В классическом подходе с суррогатным ключом SQL будет выглядеть примерно так: "SELECT Invoice.InvoiceNumber FROM Invoice INNER JOIN Customer ON Invoice.CustomerID = Customer.CustomerID WHERE Customer.CustomerCode = 'XYZ123'"
.
3) Они способствуют более универсальному подходу к моделированию данных. При использовании естественных ключей один и тот же дизайн может использоваться практически без изменений в разных механизмах SQL. Многие подходы с суррогатными ключами используют специальные методы механизма SQL для генерации ключей, что требует большей специализации модели данных для реализации на разных платформах.
Аргументы для суррогатных ключей имеют тенденцию вращаться вокруг проблем, специфичных для движка SQL:
1) Они позволяют легче изменять атрибуты при изменении бизнес-требований / правил. Это происходит потому, что они позволяют изолировать атрибуты данных в одной таблице. Это в первую очередь проблема для механизмов SQL, которые неэффективно реализуют стандартные конструкции SQL, такие как DOMAIN. Когда атрибут определен оператором DOMAIN, изменения атрибута могут быть выполнены в рамках всей схемы с помощью оператора ALTER DOMAIN. Различные механизмы SQL имеют разные характеристики производительности для изменения домена, а некоторые механизмы SQL вообще не реализуют DOMAINS, поэтому разработчики моделей данных компенсируют эти ситуации, добавляя суррогатные ключи, чтобы улучшить возможность вносить изменения в атрибуты.
2) Они обеспечивают более простую реализацию параллелизма, чем естественные ключи. В случае естественного ключа, если два пользователя одновременно работают с одним и тем же набором информации, таким как строка клиента, и один из пользователей изменяет значение естественного ключа, тогда обновление вторым пользователем завершится неудачно, потому что код клиента, который он обновляет, больше не существует в базе данных. В случае суррогатного ключа обновление будет успешно выполнено, поскольку неизменяемые значения идентификаторов используются для идентификации строк в базе данных, а не изменяемых кодов клиентов. Однако не всегда желательно разрешать второе обновление - если код клиента изменился, возможно, что второму пользователю не будет разрешено продолжить их изменение, потому что фактическая «идентичность» строки изменилась - второй пользователь может обновлять не тот ряд. Ни суррогатные ключи, ни естественные ключи сами по себе не решают эту проблему. Всесторонние параллельные решения должны решаться вне реализации ключа.
3) Они работают лучше, чем естественные ключи. Производительность наиболее напрямую зависит от механизма SQL. Одна и та же схема базы данных, реализованная на одном и том же оборудовании с использованием разных механизмов SQL, часто будет иметь резко отличающиеся характеристики производительности из-за механизмов хранения и поиска данных механизмов SQL. Некоторые механизмы SQL близко приближаются к системам с плоскими файлами, где данные фактически сохраняются избыточно, когда один и тот же атрибут, такой как код клиента, появляется в нескольких местах в схеме базы данных. Это избыточное хранилище с помощью механизма SQL может вызвать проблемы с производительностью, когда необходимо внести изменения в данные или схему. Другие механизмы SQL обеспечивают лучшее разделение между моделью данных и системой хранения / извлечения, что позволяет быстрее изменять данные и схему.
4) Суррогатные ключи работают лучше с определенными библиотеками доступа к данным и средами графического интерфейса. Из-за однородного характера большинства конструкций суррогатных ключей (пример: все реляционные ключи являются целыми числами), библиотеки доступа к данным, ORM, и структуры GUI могут работать с информацией, не требуя специальных знаний о данных. Естественные ключи из-за их разнородной природы (разные типы данных, размер и т. Д.) Не работают так же хорошо с автоматизированными или полуавтоматическими наборами инструментов и библиотеками. Для специализированных сценариев, таких как встроенные базы данных SQL, проектирование базы данных с учетом конкретного инструментария может быть приемлемым. В других сценариях базы данных являются корпоративными информационными ресурсами, доступ к которым осуществляется одновременно несколькими платформами, приложениями, системами отчетов и устройствами, и, следовательно, они не функционируют так же хорошо, если они ориентированы на какую-либо конкретную библиотеку или инфраструктуру. Кроме того, базы данных, предназначенные для работы с определенными наборами инструментов, становятся предметом ответственности при выпуске следующего замечательного набора средств.
Я склонен падать на сторону естественных ключей (очевидно), но я не фанатичен в этом. Из-за среды, в которой я работаю, где любая конкретная база данных, которую я помогаю проектировать, может использоваться различными приложениями, я использую естественные ключи для большей части моделирования данных и редко представляю суррогаты. Тем не менее, я не изо всех сил пытаюсь повторно реализовать существующие базы данных, которые используют суррогаты. Системы с суррогатными ключами работают просто отлично - не нужно менять то, что уже хорошо работает.
Есть несколько отличных ресурсов, обсуждающих достоинства каждого подхода:
http://www.google.com/search?q=natural+key+surrogate+key
http://www.agiledata.org/essays/keys.html
http://www.informationweek.com/news/software/bi/201806814