Создать масштабируемую схему базы данных для хранения результатов игры в гольф - PullRequest
3 голосов
/ 30 января 2011

Я пытаюсь создать базу данных для хранения всех моих друзей и результатов игры в гольф.Как вы, наверное, знаете, счет в гольфе состоит из 18-луночных индивидуальных очков.Я могу придумать два способа разработки схемы:

  1. Создать таблицу, в которой есть один столбец для каждого отверстия (например, от h1 до h18), таблица имеет FK player_id, round_id и course_id, которыессылались на другие таблицы.Он имеет общий столбец, который представляет собой сумму столбцов от h1 до h18.Если я изменю счет отверстия, мне нужно будет вручную обновить итоговый столбец.

  2. Создать таблицу, в которой есть столбец для оценки отверстия, столбец для индекса отверстия, столбец для player_id, course_id и round_id.Чтобы получить общий балл за раунд, мне нужно будет выполнить SUM-запрос к round_id, player_id.

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

Я использую MySQL 5 с PHP5.Спасибо.

Обновление> Примеры запросов: 1. Чтение результатов 9/18 от всех игроков за раунд и построение карты показателей.2. Базовые характеристики, такие как определение наименьшего / среднего / наибольшего общего количества очков игрока за последние X раундов.3. Более продвинутые характеристики, такие как средняя оценка любой дыры за последние X раундов.

Ответы [ 2 ]

4 голосов
/ 30 января 2011

Какой был мой средний, самый высокий и самый низкий балл?

Сценарий 1.

select (h1+h2+h3+h4+h5+h6+h7+h8+h9+h10+h11+h13+h14+h15+h16+h17+h18) / 18 as avg_score
      ,greatest(h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) as highest
      ,least(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) as lowest
  from scores
 where player_id = 1;

против

select avg(score) as avg_score
      ,max(score) as highest
      ,min(score) as lowest
  from scores
 where player_id = 1;

Какая дыра была моей худшей?

Сценарий 2.

select case when h1 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H1'
            when h2 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H2'
            when h3 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H3'
            when h4 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H4'
            when h5 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H5'
            when h6 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H6'
            when h7 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H7'
            when h8 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H8'
            when h9 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H9'
            when h10 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H10'
            when h11 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H11'
            when h12 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H12'
            when h13 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H13'
            when h14 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H14'
            when h15 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H15'
            when h16 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H16'
            when h17 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H17'
            when h18 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H18'
        end as hole_highest_score      
  from scores
 where player_id = 1;

против

select hole, score
  from scores s1
 where player_id = 1
   and score = (select max(score)
                  from scores s2
                 where s2.player_id = s1.player_id)

Я бы пошел со сценарием 2 в любой день:)

2 голосов
/ 30 января 2011

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

Однако вам придется справиться с ситуацией, когда вы и ваши друзья решите пойти на 9 или 36 лунок. Существует также проблема с тем, как хранить дополнительную информацию для каждой лунки, если таковая имеется. Схему с отдельной таблицей с рядом для каждой лунки, которую играет игрок, будет гораздо легче поддерживать.

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

Как только сценарий использования будет иметь дело с информацией, связанной с конкретной дырой, ваш код приложения и / или SQL будет сложнее писать и поддерживать. Возьмем, к примеру, получение среднего балла по конкретной лунке за все сыгранные игры.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...