Нужна помощь с дизайном базы данных для Top 10 - PullRequest
1 голос
/ 22 июня 2011

Я пытаюсь придумать дизайн базы данных, который будет содержать результаты «Топ 10» для некоторых вычислений, которые в настоящее время выполняются. В основном, когда все сказано в готовом виде, будет 3 категории «Топ-10», которые меня устраивают, так как все они являются отдельными таблицами, однако мне нужно иметь возможность вернуться назад и позже извлечь исторические данные о том, что было в Топ-10 в определенное время, следовательно, необходимость в базе данных, хотя плоский файл будет работать, он может содержать данные за годы.

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

Итак, по сути, мне нужно сохранить: группу из 10 имен,% от общего количества очков, которое имело каждое имя, ранг, который они имели в Топ-10, и время, связанное с этими Топ-10 (так что я могу позже запрос на это время)

Я бы подумал, что мне нужна таблица для Топ-10 с 11 столбцами, один для идентификатора и 10 для Внешнего ключа таблицы «Имена», который содержит каждое имя, когда-либо использовавшееся с PK, Name,%, и ранг. Мне это кажется неуклюжим, у кого-нибудь еще есть предложения?

edit : «Топ 10» связан с определенным набором данных для 5-минутных интервалов, и каждый интервал полностью независим от предыдущих или будущих интервалов.

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

Я не рекомендую ваше решение, потому что тогда, если вы хотите спросить базу данных «Как часто Джо был в топ-10», вам нужно написать 10 запросов вида

SELECT Date FROM Top10 WHERE FirstPlace = 'joe'
SELECT Date FROM Top10 WHERE SecondPlace = 'joe'
...

Вместо этого, как насчет таблицы ранжирования с полями:

id
Date
Person
Rank

Тогда, если вы хотите список 10 лучших на определенную дату, запрос будет

SELECT * FROM Rankings WHERE Date = ...

, и если вы хотитезнать чей-то исторический рейтинг, запрос

SELECT * FROM Rankings WHERE Person = ...

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

SELECT * FROM Rankings WHERE Rank = 1

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

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

Я предполагаю, что ваша «Топ-10» является снимком данных за определенное время.И ваша бизнес-логика заключается в том, что «каждые 5 минут», так что время является родительской сущностью для дизайна таблицы

top_10_history
    th_id - the primary key
    th_time - the time point when taking the snapshot data of "Top 10"
top_10_detail
    td_th_id - the FK to top_10_history
    td_name_id - the FK to name
    td_percentage - the "%"
    td_rank - the rank
  1. Если последовательность «Топ-10» можно рассчитать по столбцам в «top_10_detail»msgstr "вам не нужен столбец, чтобы сохранить его последовательность.В противном случае вам понадобится столбец, чтобы сохранить последовательность для него.
  2. Если вам нужен более сложный запрос, например «Лучшие 10 в 12:00 за последние 30 дней», используя отдельные столбцы для «дня»,«час» и «минута» были бы лучшей идеей для производительности (с подходящими индексами).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...