Дизайн базы данных для нескольких вариантов игры - PullRequest
1 голос
/ 02 июня 2011

Надеюсь, цель этих таблиц будет очевидна, но на всякий случай вот простое объяснение: я в основном хочу сохранить результаты матчей (пул из 8 шаров и т. Д.), Но также записывать результаты по кадрам. Проблема в том, что я собираюсь разрешить разные типы игр по мере роста моего приложения, и поэтому система подсчета очков, используемая в каждом кадре, будет отличаться. Я думаю, что приведенное ниже решение может сработать, но мне оно не совсем подходит, все советы приветствуются.

Есть ли более разумный подход, чем использование следующих таблиц:

# Игроки

  • ID
  • имя
  • ник

# NormalMatches

  • ID
  • playerA
  • playerB

# NormalFrames

  • ID
  • match_id
  • playerAWon (BOOL)

# ScoringPoolMatches

  • ID
  • playerA
  • playerB

# ScoringPoolFrames

  • ID
  • match_id
  • playerA_cue_ball_potted
  • playerB_cue_ball_potted
  • playerA_balls_potted
  • playerB_balls_potted
  • playerA_balls_remaining
  • playerB_balls_remaining

(редактирование: измененная таблица ScoringPoolFrame, чтобы лучше понять, в чем проблема.)

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 02 июня 2011

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

Игроки

  • id *
  • имя
  • псевдоним

Совпадения

  • id *
  • playerA
  • playerB
  • victory_player_id

Игры

  • match_id *
  • game_id *
  • player_id
  • оценка

game_id будет номером кадра в боулинге или установленным номером в теннисеили иннинг в бейсболе

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

Матчи

  • match_id *
  • player_id *
  • winner (bool)

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

0 голосов
/ 02 июня 2011

Руководящий принцип: Меньше значит больше.В этом случае меньше таблиц = хорошо.

Совпадение - это совпадение, а фрейм - это фрейм, поэтому ...

  • Объедините таблицы "NormalMatches" и "ScoringPoolMatches" вместеи ввести столбец is_scoring boolean, чтобы дифференцировать
  • . Объединить таблицы «NormalFrames» и «ScoringPoolFrames» в просто «Frames» (id, playerA_score, playerB_score), но просто выделить 1 балл за победуи «0» за проигрыш для обычных игр.Тогда ваш расчет выигрыша / проигрыша одинаков для всех фреймов.

Создание представлений для захвата логики вычислений, например,

CREATE VIEW FRAME_RESULT AS
SELECT
    id,
    playerA_score > playerB_score as playerAWon,
    playerB_score > playerA_score as playerBWon,
    playerA_score = playerB_score as is_draw
FROM Frames
...