2011-05-28 1 views
1

Получил кромку края, которую я надеюсь решить.MySQL :: Edge Case :: Mixed Type Foreign Key :: Возможно или мечтает?

Мы управляем спортивным отчетом, который записывает среди других статистических данных результаты бокса, которые могут включать в себя нелигового/не-реестрового противника. Под этим я подразумеваю, что в некоторых случаях противник Foo не имеет списка (и никогда не будет) в нашей системе.

Вместо того, чтобы просто опускать любую статистику для команды противника, владелец запросил давно, что мы вставляем опцию, позволяющую вводить имена игроков (в отличие от выбора [playerID] из раскрывающегося списка имен игроков для существующего списка). Итак, наша таблица ростов имеет столбец int playerID PK, но наши таблицы статистики (нарушение & защиты) имеют столбцы идентификатора varchar.

Это позволяет нам выполнять внешнее соединение в таблице списка и получать соответствующие записи независимо от того, существует ли список команд или нет (если мы просто не распечатываем файл статистики игрока varchar statID как имя игрока). Взломанный наверняка, но выполняет эту работу.

Теперь у меня есть таблица FK таблицы результатов в таблице статистики, поэтому, если результат игры будет удален, связанные статистики также будут. Однако нам не хватает важного ограничения: список >> статистика. Поскольку типы столбцов идентификатора игрока не совпадают, я не могу добавить FK мне нужно заполнить пробел ограничений (т. Е. Удалить игрока из списка, а все его/ее показатели будут потеряны, а не хороши).

Любые идеи о том, как обойти это?

+2

Используйте триггер, чтобы принудительно удалить каскад. –

+0

+1 @ Денис, да, или иметь дело с ним на уровне промежуточного слоя. Однако попытаться интегрироваться с ORM, поэтому надеялся, что сможет определить ограничение в промежуточном программном обеспечении и применить его в MySQL. – virtualeyes

+0

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

ответ

0

Мой опыт в том, что это проблема, с которой сталкиваются разработчики, но на практике она обычно не возникает.

Удаляет игроков в реальный прецедент? Хочет ли пользователь вернуться к игре и не увидеть имя «исторического» игрока?

Я бы рекомендовал два изменения:

  1. Все игроки неактивные, то вы можете отобразить их с какой-то неактивного флага по их имени, а не удаляться.
  2. Добавьте столбец StatsPlayerName в таблицу статистики и переместите все имена «текстовых» игроков в него из столбца playerID. Затем stat должен иметь либо идентификатор игрока, либо имя StatPlayerName. Теперь вы можете сделать свое соединение, и если имя RosterPlayerName равно null, тогда покажите StatsPlayerName. Это позволит вам добавить ограничение внешнего ключа на идентификатор игрока.
+0

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