0

Я выкладываю дизайн базы данных и задаю вопрос о создании составного идентификатора. Часть базы данных, на которой я застрял, представляет собой таблицу «раундов».Создание SQL-составной ключевой логики

Целью базы данных является сохранение результатов боев ММА, позволяющих проводить статистический анализ.

В каждом бою есть три судьи, которые забивают раунд. Я думаю, что мой лучший маршрут - создать таблицу «раундов», которая уникальна для каждого «fightID_FK» + «fighterID_FK» + «judID_FK» + «roundNum». Моя мысль состоит в том, чтобы создать композицию из этих 4 столбцов для создания одного ПК. Единственной другой колонкой в ​​этой таблице будет «roundScore», который является оценкой судьи, дает бойца в бою в раунде 1,2,3,4 или 5.

Это лучший способ пойдите об этом? Есть ли какие-то факторы, которые я не рассматриваю?

+5

Совокупный ключ * не * означает 4 столбца, объединенные в 1. Совокупный ключ - это ключ, который охватывает несколько столбцов. Вы должны добавить ограничение по ключу, которое включает все 4 столбца. – sqlvogel

+0

Да, я понимаю, я конкатенировал столбцы выше, чтобы показать, о чем я думал. Я предполагаю, что мой вопрос: если есть недостаток или недостаток, связанный с добавлением ограничения ключа на 4 строки, а просто с авто увеличивающим столбец, который идентифицирует каждую из этих строк? –

ответ

1

Ваш 4-столбцовый «натуральный» ключ - хорошая идея. Добавление столбца (суррогатного) идентификатора не помогает ограничить допустимые значения; вы должны объявить ключ, добавляете ли вы id. И когда другая таблица имеет FK на идентификаторе в исходной таблице и имеет любой из 4 столбцов, а значение для идентификатора и эти столбцы также должны отображаться в исходной таблице, тогда вам все равно необходимо ограничение в таблице ссылок, которое будет иметь не было необходимости, если бы у вас только FK для 4 столбцов и без id. (И в большинстве СУБД, что ограничение вряд ли будет исполнено декларативно, в отличие от FK.)

PS Оправдывающ, что таблица нормализована до некоторой нормальной форме требует, показывая, что она имеет определенные свойства или после определенных процедур. Недостаточно лишь показать, что конкретный набор столбцов является ключом-кандидатом (т.е. уникальным без меньшего уникального подмножества).

PPS

Даже если ваш стол в 6NF следует принуждать ограничение, которое связанно с вложенным присоединиться к зависимости.

В бою, как правило, более одного бойца. Поэтому, когда появляется строка с данным раундом и одним бойцом, должен быть ряд с тем же боем, судья и круглый, но еще один боец. Могут быть более одного судьи боя. Если есть ряды с двумя судьями того же боя, истребитель и круглый, и еще один ряд с одним из этих судей и тот же бой, истребитель и другой раунд, то должен быть еще один ряд с другим судьей с этим боем, истребитель и круглые. Поэтому, хотя ваши четыре столбца образуют ключ-кандидат для вашей таблицы с пятью столбцами, а ваша таблица находится в 6NF, ваша таблица подвержена «аномалиям», которые не устраняются путем нормализации через разложение к проекциям.

Рассмотрите таблицы Particpated (fighterID, fightID), Судья (judID, fight_ID, judID) & Round_of (roundNum, fight_ID). Проекция вашей таблицы на fightID, fighterID, judID & roundNum всегда участвует JOIN Судья JOIN Round_of. К сожалению, большинство СУБД не позволяют вам принудительно применять это ограничение декларативно.

+0

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

+0

Вы правы, что, хотя эта таблица подвержена зависимостям, связанным с * встроенным *, с соответствующими аномалиями обновления, они не являются тем, что нормализация удалит. См. Мое измененное сообщение. – philipxy