Может ли внешний ключ одновременно являться первичным ключом? MySQL

Вот схема БД и получается, что в таблицах "Журнал покупок" и "Журнал поставок" primery key совпадает с foreign key введите сюда описание изображения


Ответы (3 шт):

Автор решения: Mark Shevchenko

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

Это помогает сохранить целостность базы, когда у вас есть несколько связанных таблиц.

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

Итак, если у вас есть таблица, на которую наложено ограничение foreign key. Если связь между таблицами один к одному, эти поля очевидно будут уникальны.

Первичный ключ тоже должен быть уникальным. Очень часто в качестве первичного ключа используют не естественный ключ, а суррогатный — целое поле, значения в котором образуют натуральный ряд 1, 2, 3, ... Но вы можете не добавлять поле, которое используется только в качестве суррогатного ключа, если у вас всё равно уже есть поле, значения в котором гарантированно уникальны.

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

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

Другое дело, когда речь идёт о связи 1 к 0 или 1. Она часто встречается, когда вы пытаетесь сохранить небольшую иерархию классов в нескольких таблицах. В этом случае внешний ключ, который используется в качестве первичного ключа, подчёркивает глубокую связь между таблицами. Вы как-бы говорите, что речь идёт о большом составном объекте, в котором могут отсутствовать некоторые части. Вы раскладываете эти части в несколько таблиц, потому что так правильно с точки зрения реляционного метода, но при этом подчёркиваете, что где-то на уровень выше эти значения будут собраны в единое целое.

В этом случае первичный ключ из поля, на которое наложено ограничение *внешний ключ — прекрасная подсказка.

→ Ссылка
Автор решения: Aziz Umarov

Ответ на может или нет? - Может. Реализация объектной модели, а не реляционной иначе говоря Ваш класс расширение какого-то родительского класса. Это самое простое применение и всё дальнейшее исходит из этой модели.

→ Ссылка
Автор решения: Roman Konoval

Вы неправильно интерпретируете диаграмму или употребляете неточную терминологию. Тут внешний ключ не совпадает с первичным ключом.

В таблице Журнал Покупок первичный ключ составной, т.е. состоит из двух полей (id_покупки, id_товара). Знак ключа означает является частью первичного ключа, а не является первичным ключом.

А на каждом из этих полей по отдельности есть два внешних ключа на соответствующие таблицы.

Эта абсолютно нормальная практика реализации отношения многие ко многим.

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

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

→ Ссылка