MySQL :: Edge Case :: Внешний ключ смешанного типа :: Возможно или мечтаете? - PullRequest
1 голос
/ 28 мая 2011

У меня есть крайний случай, который я надеюсь разрешить.

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

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

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

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

Есть идеи, как обойти это?

1 Ответ

0 голосов
/ 24 сентября 2012

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

Является ли удаление игроков реальным вариантом использования? Пользователь хочет вернуться, чтобы посмотреть на игру и не увидеть «историческое» имя игрока?

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

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