Схема SQL Site Leader Board - PullRequest
       77

Схема SQL Site Leader Board

0 голосов
/ 02 июля 2019

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

Итак, у меня есть таблица задач, которая выглядит следующим образом:

Challenge ID    Challenge Name  Challenge Date  Sport   Prize Pool  

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

связано с идентификатором вызова, где это будет = идентификатор таблицы лидеров

У меня есть таблица лидеров из 50 человек для этого задания, которое будет выглядеть примерно так:

Challenge ID     User             Place            Prize Won

У меня вопрос 2 вещи:

  1. Как настроить автоматическое создание таблицы при добавлении нового вызова в таблицу испытаний?

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

    Rank        USER          Prize Money Won(total every challenge placed)
    

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

Я знаю, что это много вопросов, заключенных в один, дизайн схемы и логика.

Любые идеи с благодарностью

1 Ответ

0 голосов
/ 02 июля 2019

Лучшим подходом, чем одна таблица на вызов, является одна таблица для всех из них. Таким образом, вы можете вычислить общие итоги и индивидуальные рейтинги вызовов по одной таблице. Вы также хотели бы не записывать место напрямую, а вычислять его на лету с помощью соответствующей оконной функции, в зависимости от того, как вы хотите обрабатывать связи (rank(), dense_rank() и row_number() будут иметь разные результаты в этих случаях ); таким образом, вам не нужно постоянно корректировать его при добавлении новых записей.

Таблица примерно такая (Вы не указали базу данных SQL, поэтому я собираюсь предположить Sqlite. Настройте по мере необходимости.):

CREATE TABLE challenge_scores(user_id INTEGER REFERENCES users(id),
                              challenge_id INTEGER REFERENCES challenges(id),
                              prize_amount NUMERIC,
                              PRIMARY KEY(user_id, challenge_id));

позволит вам делать такие вещи, как

SELECT *
FROM (SELECT user_id,
             sum(prize_amount) AS total,
             rank() OVER (ORDER BY sum(prize_amount) DESC) AS place 
      FROM challenge_scores
      GROUP BY user_id)
WHERE place <= 50
ORDER BY place;

для глобального списка лидеров или аналогичного:

SELECT *
FROM (SELECT user_id,
             prize_amount,
             rank() OVER (ORDER BY prize_amount DESC) AS place 
      FROM challenge_scores
      WHERE challenge_id = :some_challenge_id
      GROUP BY user_id)
WHERE place <= 50
ORDER BY place;

для конкретной задачи.

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