2012-03-20 5 views
2

У меня есть база данных для фэнтези-футбола. Есть три схемы:Совет по дизайну базы данных (конкретный пример - Fantasy Football)

  • AFL (относящаяся к субъектам Австралийской футбольной лиги)
  • ddhp (относящаяся к местным лицам фантазии конкуренции) и
  • ДБО (для юридических лиц конкретно не принадлежащих либо).

Описание лиц

  • Каждый игрок играет за AFL Team (нет необходимости отслеживать это по времени, так что я просто записать текущую команду игрок играет за, и обновлять это, если игрок меняет клубы).
  • Некоторые игроки играют за команду ddhp. Это выражается Контрактом, который имеет FromRound и ToRound, выражая временные рамки, для которых договор действителен.
  • Есть Раунды. В принципе нет никакой разницы между afl и ddhp round, поэтому есть только одна таблица.
  • Есть светильники, которые представляют две команды ddhp, играющие друг против друга в раунде.
  • Когда игрок играет в раунде, они записывают статистику.
  • Каждый раунд, каждая команда ddhp выбирает из своих контрактных игроков тех, кто будет играть за них круглый. Это представлено RoundPlayers.

Проблема в том, что между RoundPlayers и Stats существует уровень неловкости. Логически, RoundPlayer имеет строку в Stats, чтобы представлять их игру в этом раунде (если они играли). Это взаимно-однозначное отношение, но обе таблицы являются необязательными. Игрок может не играть в раунд и, следовательно, не имеет статистики. Игрок также не может быть выбран в качестве RoundPlayer и поэтому не имеет строки в этой таблице. Один из них управляется Round и PlayerId, а другой - Round and ContractId. Перемещение с одного на другое немного неудобно, особенно при попытке использовать ORM (например, Entity Framework 4), поскольку свойства навигации основаны на внешних ключах, тогда как эта взаимосвязь проходит через промежуточную таблицу (Контракт) для получения PlayerId.

Я думал о добавлении ContractId к статистике (если игрок был выбран, чтобы играть в этот раунд), но это было неправильно. Я также подумал об удалении отношения 1-к-1 между Stat и Roundplayer и перемещении их на один стол, но это тоже было не так.

Я был бы признателен за любые мысли о том, как улучшить отношения между RoundPlayer и Stat или даже любые идеи, которые могут полностью изменить эту структуру.

enter image description here

ответ

0

Я вижу это была опубликована год назад, и вы не получили никаких ответов. Надеюсь, вы уже кое-что поняли и не тратите время на проверку Stackoverflow каждый день, чтобы узнать, поможет ли кто-нибудь помощь. Но для целей общей дискуссии, вот мой ответ:

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

Как я понимаю ваше описание, если есть запись RoundPlayers, всегда будет ровно одна соответствующая статистика, и наоборот.В этом случае, я думаю, что ответ учебника:

(a) Объедините два в одну запись. Они всегда идут вместе, почему бы не сделать их одной записью? Основная причина, по которой я не вижу этого, заключается в том, что, возможно, RoundPlayer интересен в разных контекстах, чем статистика. То есть, RoundPlayer интересен, когда мы планируем, но статистика интересна для долгосрочного накопления производительности игрока.

Или (b) Отбрасывать внешние ключи в Stats в Team, Player и Rounds. Вместо этого дайте ему один внешний ключ для RoundPlayer или, возможно, дублируйте ссылки на Контракт и Раунд. Это сделает ваши ключи непротиворечивыми.

Ссылка на команду кажется особенно подозрительной для меня. Не могли бы вы найти команду через игрока? Если проигрыватель переключается на другую команду, следует ли обновлять команду в Stats? Если это так, это избыточно и создает возможность выхода из синхронизации. Или Стат остается привязан к исходной команде? Но какая разница в команде, так как это команда AFL, а не команда DDHP? Возможно, я не понимаю требования. Я ничего не знаю об австралийском футболе. (Это должна быть очень сложная игра, так как игроки должны все соревноваться, вися вверх дном со всего мира ...)

+0

Спасибо, Джей, я рад, что у меня есть комментарии, даже поздние. Проблема все еще существует, хотя она смягчается с помощью других методов. (a) не работают, поскольку RoundPlayers существуют до статистики. Они создаются в разное время. Кроме того, не все Stats имеют RoundPlayer. (b) не работает, поскольку не все Stats имеют RoundPlayer. Я вижу, что в моем вопросе не было ясно, когда я сказал, что есть отношения 1 к 1, отредактирует позже :) – Simon