Что такое составной ключ в таблице и приведите пример
Что проверяют
Умеете ли вы выводить правила уникальности из предметной области, а не копировать их из чужой схемы. Для аналитика составной ключ это способ записать в модели утверждение вида «одна и та же пара значений не повторяется», поэтому заодно проверяют, отличаете ли вы ключ от индекса, а естественный ключ от суррогатного.
Как отвечать
Составной ключ это первичный ключ или ограничение уникальности из двух и более колонок: уникальна не каждая колонка по отдельности, а их комбинация. Классические случаи это таблица-связка многие ко многим и строки документа.
create table order_items (
order_id bigint not null references orders(id),
product_id bigint not null references products(id),
qty integer not null,
primary key (order_id, product_id)
);Такой ключ говорит: товар встречается в заказе не больше одного раза, повтор оформляется количеством. Это бизнес-правило, и согласовывать его нужно с заказчиком.
Полезно добавить три факта. Колонки составного ключа автоматически обязательны. Их порядок задаёт порядок в поддерживающем индексе, поэтому поиск по одному лишь второму полю им не ускорится. Естественный составной ключ удобен для целостности, но тянется во все дочерние таблицы, поэтому рядом часто заводят суррогатный идентификатор, а бизнес-уникальность оставляют отдельным ограничением.
Где спотыкаются
Приводят пример, который сам себе противоречит: объявляют ключ по покупателю и товару прямо в таблице заказов и тут же говорят, что покупатель может заказать товар повторно. Такой ключ как раз запрещает повторную покупку, и модель ломается на первом реальном сценарии.
Путают составной ключ с составным индексом. Ключ это ограничение, гарантия отсутствия дублей. Индекс это структура для скорости, СУБД создаёт его под ограничение сама. Называть ускорение поиска преимуществом ключа значит выдавать поверхностное понимание.
Забывают про пустые значения. В ограничении уникальности по нескольким колонкам пустое значение не равно другому пустому, поэтому строки, которые человек считает дублями, проходят беспрепятственно. Если колонка необязательна, уникальность закрывают частичным индексом или значением-заглушкой.