Подтвердить что ты не робот

Должны ли многие из многих таблиц иметь первичный ключ?

Если у меня есть два объекта, которые имеют отношение "многие ко многим", я бы, как правило, моделировал их в моей схеме базы данных с таблицей "многие-ко-многим", чтобы связать их. Но следует ли, чтобы таблица "многие-ко-многим" (или "join table" ) имела первичный ключ (целочисленный автоинкремент)?

Например, у меня могут быть таблицы A и B, каждый с идентификатором, и таблица с именем A_B, которая имеет внешний ключ (A_ID, B_ID). Но должен ли A_B иметь первичный ключ с автоинкрементным идентификационным столбцом, или нет?

В чем преимущества и недостатки его добавления? Мне лично нравятся естественные ключи для многих-ко-многим. Но какое добавленное преимущество добавит первичный ключ?

4b9b3361

Ответ 1

Я согласен со всем, что сказал Одед, кроме

"Он не может быть разумно использован как внешний ключ."

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

Возьмите простой случай с автомобилем и цветом. Каждый год автопроизводители имеют определенный поддон цветов, и каждая модель поставляется только в ограниченном количестве этих цветов. Модели Many - Many:: Colors to Cars

Итак, теперь создайте таблицу заказов, в которой хранятся заказы новых автомобилей. Очевидно, что цвет и модель будут отображаться в таблице заказов. Если вы сделаете FK для каждой из этих таблиц, база данных позволит выбрать некорректную модель/комбинацию цветов. (Конечно, вы можете применить это с помощью кода, вы не можете сделать это декларативно.) Если вы сделаете родительский стол таблицей many: many, вы получите только комбинации, которые были указаны.

SO, вы бы предпочли многоколоночный FK и указали на PK, построенный как на ModelID, так и на ColorID, или вам нужен один столбец FK?

Выберите свой яд.

ИЗМЕНИТЬ

Но если он не является родителем чего-то, для таблицы нет суррогатного ключа.

Ответ 2

Такой суррогатный ключ ничего не добавляет, кроме накладных расходов.

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

Чтобы развернуть:

В приложении этот ключ будет бессмысленным и останется неиспользованным.

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

Он также не может быть использован как внешний ключ.

Ответ 3

Я сделал это в обоих направлениях. Иногда это полезно для добавления функции вниз по дороге. Например, если бы было когда-либо время, что строка в таблице никогда не содержала бы ничего, кроме двух идентификаторов. Если вам не хватает места, я бы поставил его там, потому что это не повредит. Иногда это может помешать инструментам ORM, таким как hibernate или ADO.NET, но это незначительно.

Итак, чтобы подвести итог... ПРОФИ 1. Позволяет потенциальный рост в будущем.

CONS 1. Пространство 2. Сбивает некоторые инструменты ORM.

Ответ 4

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

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

Ответ 5

Это не дает ничего полезного. Имейте в виду цель ключа, который должен однозначно ссылаться на "что-то". Стол ассоциаций, подобный этому, сам по себе не является "чем-то", а скорее устойчивой структурой для двух других "вещей", которые уже имеют ключи. Вне среды сохранения (базы данных) она не имеет никакого значения и не должна даже существовать или быть известна (например, в бизнес-области), поэтому никогда не было бы причин ссылаться на нее его собственный идентификатор.