Следует ли рассматривать связь данных «два-ко-многим» как «многие-ко-многим»?

StackOverflow https://stackoverflow.com/questions/1674785

Вопрос

У меня есть 2 таблицы базы данных:Команды и игры.

Для целей этого вопроса мы имеем дело с футбольными (футбольными) командами и играми.

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

Мой вопрос заключается в том, следует ли мне представлять эту связь данных с помощью двух внешних ключей в таблице Games (home_team_id, away_team_id) или мне следует использовать связь «многие-ко-многим» с таблицей games_teams, чтобы связать их, и в этом случае мне понадобится также хранить информацию о том, была ли команда хозяевами или гостями, и это кажется немного излишним.

Чтобы еще больше запутаться, я использую библиотеки ORM в KohanaPHP, и они ожидают, что fk будет называться team_id или таблица ссылок будет содержать только 2 столбца.Если у вас есть опыт решения этой проблемы в KohanaPHP, пожалуйста, оставьте ответ, в противном случае мы будем очень признательны за любые общие советы.

Это было полезно?

Решение

Если вы хотите иметь возможность прикрепить значок «Xth Normal Form» на своем сервере базы данных, то его, вероятно, следует рассматривать как «многие ко многим», в противном случае, я думаю, вы сократите накладные расходы на запросы, уменьшив на одну таблицу меньше ты просто собираешься присоединиться через каждый время, когда вам нужны полезные данные.

Другие советы

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

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

По нормализации:Да.Существует только связь «один-ко-многим» или «многие-ко-многим», которая разбивается на одно или несколько отношений «один-ко-многим».

Но, если говорить реалистично, если бы я сохранил что-то вроде ПОЛА.Действительно ли мне понадобится мультисостояние и отметка даты и времени, прикрепленная к этому?

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

Я бы сохранил одну таблицу с двумя ключами - если только нет деловой причины отслеживать ее как таковую.

В зависимости от того, как вы это абстрагировали, я бы сказал, что в футбольной игре ДОЛЖНЫ участвовать две команды, и в этом случае наличие столбцов в таблице игр не только удобнее, но и правильнее.

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

Я думаю, вам НЕ следует иметь для этого отдельную таблицу.Проще программисту, проще БД.Приятно подумать о том, что если, но похоже, что вы уже это сделали.Не поддавайтесь мысли, что нормализация – это всегда лучший способ добиться всего.

Я уважаю ответы других, утверждая, что использование двух столбцов — лучший выбор, однако вы упомянули, что используете библиотеку ORM в Kohana.Используя два столбца в таблице игр, вы теряете возможности ORM для отношений «многие ко многим».Если вы настроили сводную таблицу games_teams, вы можете сделать следующее:

$game = ORM::factory('game', 1); // 1 is the game id

Затем вы можете просмотреть команды в этой игре:

foreach ($game->teams as $team) {
// do stuff with $team
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top