Как я должен реализовать систему ранжирования

#mysql

#mysql

Вопрос:

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

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

  • 2 очка / матч будет присужден команде-победителю.
  • Команде-победителю будет начислено дополнительное 1 очко, если матч был четвертьфиналом.
  • Команде-победителю будут начислены дополнительные 2 очка, если матч был полуфиналом.
  • Команде-победителю будут начислены дополнительные 5 очков, если матч был финальным.
  • Победа во всех матчах пула добавит 4 очка к вашему командному баллу.
  • Победа в более чем 3 турнирах добавит 15 очков вашей команде.

Я начал с создания следующих таблиц

Игроки

  ---------- ------------------------------------- ------ ----- --------------
| Field    | Type                                | Null | Key |  ---------- ------------------------------------- ------ ----- --------------
| id       | int(11)                             | NO   | PRI | 
| name     | varchar(250)                        | NO   |     | 
| image    | text                                | YES  |     | 
| plays    | enum('RH','LH')                     | NO   |     | 
| added_on | datetime                            | NO   |     | 
| status   | enum('active','inactive','retired') | NO   |     |    ---------- ------------------------------------- ------ ----- --------------
  

Команды

  ------------ ---------------------------- ------ ----- ------------------- ---------------- 
    | Field      | Type                       | Null | Key | Default           | Extra          |
     ------------ ---------------------------- ------ ----- ------------------- ---------------- 
    | id         | int(11)                    | NO   | PRI | NULL              | auto_increment |
    | name       | varchar(150)               | NO   | UNI | NULL              |                |
    | image      | text                       | YES  |     | NULL              |                |
    | status     | enum('active','in-active') | NO   |     | active            |                |
    | added_on   | datetime                   | NO   |     | CURRENT_TIMESTAMP |                |
    | updated_on | datetime                   | YES  |     | NULL              |                |
     ------------ ---------------------------- ------ ----- ------------------- ---------------- 
  

Игрок в команды

  ----------- --------------------------- ------ ----- ------------------- ---------------- 
| Field     | Type                      | Null | Key | Default           | Extra          |
 ----------- --------------------------- ------ ----- ------------------- ---------------- 
| id        | int(11)                   | NO   | PRI | NULL              | auto_increment |
| player_id | int(11)                   | NO   | MUL | NULL              |                |
| team_id   | int(11)                   | NO   |     | NULL              |                |
| status    | enum('active','inactive') | NO   |     | NULL              |                |
| added_on  | datetime                  | NO   |     | CURRENT_TIMESTAMP |                |
 ----------- --------------------------- ------ ----- ------------------- ---------------- 
  

Турниры

  ------- -------------- ------ ----- --------- ---------------- 
| Field | Type         | Null | Key | Default | Extra          |
 ------- -------------- ------ ----- --------- ---------------- 
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | NO   |     | NULL    |                |
| year  | int(4)       | NO   |     | NULL    |                |
 ------- -------------- ------ ----- --------- ---------------- 
  

Матчи

  --------------- --------------------------------------- ------ ----- ------------------- ---------------- 
| Field         | Type                                  | Null | Key | Default           | Extra          |
 --------------- --------------------------------------- ------ ----- ------------------- ---------------- 
| id            | int(11)                               | NO   | PRI | NULL              | auto_increment |
| team_one      | int(11)                               | NO   | MUL | NULL              |                |
| team_two      | int(11)                               | NO   |     | NULL              |                |
| winner_id     | int(11)                               | NO   |     | NULL              |                |
| tournament_id | int(11)                               | NO   | MUL | 1                 |                |
| added_on      | datetime                              | NO   |     | CURRENT_TIMESTAMP |                |
| match_type    | enum('pool','quarter','semi','final') | NO   |     | pool              |                |
| sets          | smallint(2)                           | NO   |     | 1                 |                |
 --------------- --------------------------------------- ------ ----- ------------------- ---------------- 
  

Match Score

  ---------- ------------------- ------ ----- ------------------- ---------------- 
| Field    | Type              | Null | Key | Default           | Extra          |
 ---------- ------------------- ------ ----- ------------------- ---------------- 
| id       | int(11)           | NO   | PRI | NULL              | auto_increment |
| match_id | int(11)           | NO   | MUL | NULL              |                |
| team_id  | int(11)           | NO   | MUL | NULL              |                |
| set_num  | enum('1','2','3') | NO   |     | NULL              |                |
| score    | smallint(2)       | NO   |     | NULL              |                |
| added_on | datetime          | NO   |     | CURRENT_TIMESTAMP |                |
 ---------- ------------------- ------ ----- ------------------- ---------------- 
  

Pools

  --------------- ------------- ------ ----- --------- ---------------- 
| Field         | Type        | Null | Key | Default | Extra          |
 --------------- ------------- ------ ----- --------- ---------------- 
| id            | int(11)     | NO   | PRI | NULL    | auto_increment |
| name          | varchar(10) | NO   | UNI | NULL    |                |
| tournament_id | int(11)     | NO   | MUL | NULL    |                |
 --------------- ------------- ------ ----- --------- ---------------- 
  

One thing that you will notice that i have not saved rank scoring anywhere and i am calculating it on runtime using the following query

 SELECT
    T.id, T.name, T.status,
    IFNULL(T.image,'no-image.png') as DP,
    (SELECT COUNT(*)
    FROM badminton_matches M
    WHERE (M.team_one = T.id OR M.team_two = T.id)) as played,
    (SELECT COUNT(*)
    FROM badminton_matches M
    WHERE M.winner_id = T.id) as won,
    (SELECT COUNT(*)
    FROM badminton_matches M
    WHERE ((M.team_one = T.id OR M.team_two = T.id)
        AND (M.winner_id != T.id))) as lost,
    (
          ((SELECT COUNT(*)
    FROM badminton_matches M
    WHERE M.winner_id = T.id) * 2)  
          (((SELECT COUNT(*)
    FROM badminton_matches M
    WHERE (M.match_type = 'quarter'
        AND M.winner_id = T.id)) * 2)   1)  
            (((SELECT COUNT(*)
    FROM badminton_matches M
    WHERE (M.match_type = 'semi'
        AND M.winner_id = T.id)) * 2)   2)  
            (((SELECT COUNT(*)
    FROM badminton_matches M
    WHERE (M.match_type = 'final' AND M.winner_id = T.id)) * 2)   5)) as Points
FROM
    badminton_teams T
ORDER BY 
        (Points) DESC;
  

Первый

  • правильно ли вычислять оценку во время выполнения с помощью запроса или

  • должен ли я сохранять и обновлять ее каждый раз, когда я сохраняю результат сопоставления в базе данных

или

  • должен ли я запланировать задание cron для этой цели

Редактировать:

Обновил запрос до следующего

 SELECT
    T.id, T.name, T.status,
    IFNULL(T.image,'no-image.png') as DP,
    (SELECT COUNT(*)
    FROM badminton_matches M
    WHERE ((M.team_one =T.id or M.team_two = T.id) and M.winner_id IS NOT NULL)) as played,
    (SELECT COUNT(*)
    FROM badminton_matches M
    WHERE M.winner_id=T.id) as won, (SELECT COUNT(*)
    FROM badminton_matches M
    WHERE ((M.team_one =T.id or M.team_two = T.id) AND (M.winner_id!=T.id))) as lost,
    ((SELECT (SUM(BMS.points_won)-SUM(BMS.points_lost))
    FROM
        badminton_match_score BMS
        JOIN badminton_matches M ON (M.id=BMS.match_id)
    where M.team_one=T.id OR M.team_two=T.id and M.winner_id is not null)/(SELECT COUNT(*)
    FROM badminton_matches M
    WHERE ((M.team_one =T.id or M.team_two = T.id) and M.winner_id IS NOT NULL))) AS AVG_SCORE,
    (
            ((SELECT COUNT(*)
    FROM badminton_matches M
    WHERE M.winner_id=T.id)*2)   
(SELECT COUNT(*)
    FROM badminton_matches M
    WHERE (M.match_type='quarter' AND M.winner_id=T.id))

             
            ((SELECT COUNT(*)
    FROM badminton_matches M
    WHERE (M.match_type='semi' AND M.winner_id=T.id))*2)
                 
            ((SELECT COUNT(*)
    FROM badminton_matches M
    WHERE (M.match_type='final' AND M.winner_id=T.id))*5)
            ) 
as Points
FROM badminton_teams T
order by (Points) DESC, lost ASC, AVG_SCORE DESC
  

Ответ №1:

правильно ли вычислять оценку во время выполнения с помощью запроса

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

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

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

должен ли я запланировать задание cron для этой цели

Если с точки зрения больших баз данных и производительности, да.

Комментарии:

1. одна из проблем в этом запросе заключается в том, что он даст вам 8 очков, даже если команда еще не сыграла ни одного матча