#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 очков, даже если команда еще не сыграла ни одного матча