Существует две конкурирующие философии по этому вопросу.
Я твердо в лагере с использованием составных первичных ключей для определенных таблиц.
Когда я создаю базу данных, я использую моделирование ER для сбора требований к информации в одном месте. Каждое значение, которое будет обслуживаться базой данных, является экземпляром атрибута, и каждый атрибут описывает объект предмета или отношение между двумя или более предметами. Внешние ключи не входят в фазу анализа.
Прежде чем начать разработку базы данных, я решаю, как будет идентифицироваться каждый объект с точки зрения приложения. Это даст мне мои основные ключи. Каждая таблица, описывающая объект, будет иметь простой первичный ключ, идентификатор для объекта. Простые отношения (двоичные, много-к-одному) не нуждаются в собственной таблице. Каждая таблица, описывающая сложные отношения, будет иметь составной первичный ключ, состоящий из первичных ключей участвующих сущностей.
Внешние ключи подключаются очевидным образом. Ну, очевидно, для меня, по крайней мере. Это обеспечивает начальный дизайн таблицы в 3NF и, возможно, выше. Дизайн таблицы может быть изменен путем дальнейшей нормализации или другими шаблонами проектирования, несовместимыми с нормализацией (так называемая денормализация). Но это первый разрез в дизайне стола.
Эта практика проектирования приводит к различным результатам в отношении производительности и целостности данных, чем преобладающая практика. Преобладающая практика помещает столбец autonumber с именем «id» в качестве первого столбца каждой таблицы. Этот столбец становится основным ключом.
По существу, эта практика использует структуру таблиц SQL для имитации модели данных графа, даже если она похожа на реляционную модель. Столбец id является суррогатом для адреса строки. Графическая модель данных имеет потенциал роста и недостаток. Подробнее об этом, если потребуется.
Вы указали некоторые причины, по которым не нужно иметь слишком большой кластерный индекс в SQL Server. Однако эти проблемы не связаны с первичными ключами. Кластеризованный индекс и ключ - это не одно и то же - даже в SQL Server. Кроме того, составной ключ может быть меньше, чем один ключ атрибута - так что размер сам по себе не является аргументом для избежания составных клавиш. – sqlvogel
@dportas: строго говоря, вы правы. Но по крайней мере 90% первичных ключей на SQL-сервере также являются ключом кластеризации - в основном потому, что многие разработчики просто ничего не знают о кластеризации ключей, а их первичные ключи автоматически становятся их ключами кластеризации. –
У меня есть таблица, основной (кластерный) ключ - это UserID и Timestamp для таблицы журналов. Я понял, что это нормально, потому что это индекс * только * index на клавиатуре. Он может генерировать суммы для одного пользователя быстро, потому что UserID является столбцом * first * в этом кластерном индексе (первичный ключ) и включает отметку времени в индексе, которая гарантирует ее уникальность. Это звучит хорошо? – Triynko