Зачем использовать несколько столбцов в качестве первичного ключа (составного первичного ключа)
этот пример взят от w3schools.
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)
Я понимаю, что оба столбца вместе (P_Id
и LastName
) представляют собой первичный ключ для таблицы Persons
. Правильно ли это?
- почему кто-то хочет использовать несколько столбцов в качестве первичных ключей вместо одного столбца?
- сколько столбцов можно использовать вместе в качестве первичного ключа в данной таблице?
8 ответов
ваше понимание правильно.
вы бы сделали это во многих случаях. Один из примеров-отношения типа OrderHeader
и OrderDetail
. ПК в OrderHeader
может быть OrderNumber
. ПК в OrderDetail
может быть OrderNumber
и LineNumber
. Если бы это было одно из этих двух, оно не было бы уникальным, но сочетание двух гарантировано уникальным.
альтернативой является использование сгенерированного (неинтеллектуального) первичного ключа, например, в этом случае OrderDetailId
. Но тогда вы не стали бы всегда смотрите на отношения так же легко. Одни предпочитают один путь, другие-другой.
Другим примером составных первичных ключей является использование таблиц ассоциаций. Предположим, у вас есть таблица person, содержащая набор людей, и таблица group, содержащая набор групп. Теперь вы хотите создать много-много отношений на человека и группу. То есть каждый человек может принадлежать ко многим группам. Вот как будет выглядеть структура таблицы с использованием составного первичного ключа.
Create Table Person(
PersonID int Not Null,
FirstName varchar(50),
LastName varchar(50),
Constraint PK_Person PRIMARY KEY (PersonID))
Create Table Group (
GroupId int Not Null,
GroupName varchar(50),
Constraint PK_Group PRIMARY KEY (GroupId))
Create Table GroupMember (
GroupId int Not Null,
PersonId int Not Null,
CONSTRAINT FK_GroupMember_Group FOREIGN KEY (GroupId) References Group(GroupId),
CONSTRAINT FK_GroupMember_Person FOREIGN KEY (PersonId) References Person(PersonId),
CONSTRAINT PK_GroupMember PRIMARY KEY (GroupId, PersonID))
пример W3Schools не говорит, Когда вы должны использовать составные первичные ключи, и дает только синтаксис примера, используя ту же таблицу примеров, что и для других ключей.
их выбор примера, возможно, вводит вас в заблуждение, комбинируя бессмысленный ключ (P_Id) и естественный ключ (LastName). Этот нечетный выбор первичного ключа говорит о том, что следующие строки действительны в соответствии со схемой и необходимы для уникальной идентификации учащегося. Интуитивно это не делает чувство.
1234 Jobs
1234 Gates
Читайте Далее: великий первичный ключ дебаты или просто Google meaningless primary keys
или даже прочитать это и
fwiw-мои 2 цента, чтобы избежать многоколоночных первичных ключей и использовать одно сгенерированное поле id (суррогатный ключ) в качестве первичного ключа и добавить дополнительные (уникальные) ограничения, где это необходимо.
Да, они оба образуют первичный ключ. Особенно в таблицах, где у вас нет суррогатный ключ, может потребоваться указать несколько атрибутов в качестве уникального идентификатора для каждой записи (плохой пример: таблица с именем и фамилией может потребовать их комбинация должны быть уникальными).
несколько столбцов в ключе, как правило, работают хуже, чем суррогатный ключ. Я предпочитаю иметь суррогатный ключ, а затем уникальный индекс на многоколоночном ключе. Таким образом, вы можете иметь лучшую производительность и уникальность, необходимую поддерживается. И даже лучше, когда одно из значений в этом ключе изменяется, вам также не нужно обновлять миллион дочерних записей в 215 дочерних таблицах.
вы используете составной ключ (ключ с более чем одним атрибутом), когда хотите обеспечить уникальность комбинации нескольких атрибутов. Один ключ атрибута не достигнет того же самого.
второй вопрос
сколько столбцов можно использовать вместе в качестве первичного ключа в данной таблице?
специфична реализация: она определена в фактической используемой СУБД.[1],[2],[3] вы должны проверить технические характеристики используемой вами системы баз данных. Некоторые очень подробные, некоторые нет. Поиск в интернете о таком ограничении может быть трудным, потому что терминология варьируется. Термин составной первичный ключ должно быть сделано обязательным ;)
Если вы не можете найти явную информацию, попробуйте с тестовой базой данных, чтобы гарантировать, что вы можете ожидать стабильной (и конкретной) обработки нарушения пределов (которые разумно ожидать). Будьте осторожны, чтобы получить правильную информацию об этом: иногда пределы накапливаются, и вы увидите разные результаты с разными макетами базы данных.
использование первичного ключа для нескольких таблиц удобно при использовании промежуточной таблицы в реляционной базе данных.
Я буду использовать базу данных, которую я когда-то сделал для примера, и, в частности, три таблицы в этой таблице. Я creäted базы данных несколько лет назад на комикс. Одна таблица называется "комиксы"-список всех комиксов, их названия, имя файла и т. д. Первичным ключом был "comicnum".
вторая таблица была "символы"- их имена и краткое описание:. Первичный ключ был на "charname".
поскольку каждый комикс-за некоторыми исключениями-имел несколько персонажей, и каждый персонаж появился в нескольких комиксах, было непрактично помещать столбец В "персонажи" или "комиксы", чтобы отразить это. Вместо этого, я creäted третий таблица называлась "comicchars", и это был список персонажей, в которых появились комиксы. Поскольку эта таблица по существу присоединилась к двум таблицам, ей нужны были только два столбца: charname и comicnum, и первичный ключ был на обоих.