В порядке. Потерпите меня, так как мне нужно предоставить много контекстных деталей, прежде чем я смогу получить разумный ответ на свой вопрос.
У меня есть сайт, который позволяет вам ежедневно выбирать акции. Это работает так, что вам предлагается сделать выбор между компаниями, которые противостоят друг другу в течение дня. Например, GE против IBM. Вы можете сделать два типа выбора: производительность (какие акции будут работать лучше?) и общий объем (будут ли объединенные акции торговаться с объемами выше или ниже X?). Вам дается 100 виртуальных долларов каждый день, чтобы сделать выбор.
В конечном счете, наша цель здесь — отследить, кто из пользователей зарабатывает больше всего денег за выбор в различных категориях (поясняется ниже) в течение следующих периодов времени: 5 дней, 15 дней, 30 дней, 90 дней, 180 дней, 1 год, все- время. Подсчитать, сколько денег зарабатывается за выбор, очень просто. Это общая сумма заработанных (или проигранных) денег / количество выборов.
Теперь каждая компания, которую выбирает пользователь, подпадает под категориальную иерархию. В общем виде категориальная иерархия выглядит так:
Подразделение --> Основная группа --> Отраслевая группа --> Классификация --> Компания
Вот некоторые примеры:
- Добыча полезных ископаемых --> Добыча металлов --> Железные руды --> Добыча бурой руды --> Компания А
- Добыча полезных ископаемых --> Добыча металлов --> Железные руды --> Добыча бурой руды --> Компания B
- Добыча полезных ископаемых --> Добыча металлов --> Железные руды --> Добыча лимонита --> Компания C
- Добыча полезных ископаемых --> Добыча металлов --> Железные руды --> Добыча лимонита --> Компания D
- Производство --> Табачные изделия --> Сигары --> Стоги --> Компания E
- Производство --> Табачные изделия --> Сигары --> Стоги --> Компания F
- Производство --> Табачные изделия --> Сигары --> Сигариллы --> Компания G
- Производство --> Табачные изделия --> Сигары --> Сигариллы --> Компания H
- …и так далее…
Для каждой категории существует модель (и, конечно же, соответствующая таблица), и они связаны (например, external_key), как вы видите выше.
Для Matchup существует модель, в которой каждая запись представляет, какие компании противостоят друг другу в течение дня. Каждая запись отслеживает начальную и конечную цены акций каждой компании, а также общий объем торгов.
У каждого Matchup есть одна или несколько :pick_price, которые могут меняться в течение дня. Обычно у каждого матч-апа есть цена выбора производительности и цена выбора общего объема. Цена определяет, сколько вам будет стоить выбор и сколько вы заработаете за правильный выбор. (Теперь это всего лишь справочная информация. Вам не нужно беспокоиться об этих конкретных расчетах цен.)
В конце торгового дня выбор пользователя разрешается. Выборки представлены в модели Pick со следующими атрибутами:
- Идентификатор пользователя
- сумма_потрачено (например, 10 долларов США)
- результат (например, ВЫИГРАЛ, ПРОИГРАЛ)
- выбрать (например, компанию А)
- matchup_id
- pick_price_id
- Сумма выигрыша
- разрешено (правда или ложь)
- создано в
- updated_at
В настоящее время, когда каждый выбор разрешен, обновляется другая таблица, называемая pick_records, которая имеет следующие атрибуты:
- Идентификатор пользователя
- записываемый_id
- recordable_type (подразделение или основная группа, или отраслевая группа, или классификация, или компания)
- пики (всего сделанные пики, независимо от типа пикинга)
- выиграл (общее количество выигранных пиков, независимо от типа пика)
- проиграно (общее количество потерянных пиков, независимо от типа пика)
- деньги (общая сумма выигранных денег)
- money_per_pick (деньги/выбор)
- performance_picks
- performance_won
- performance_lost
- performance_money
- performance_money_per_pick
- Volume_picks
- том_выиграл
- объем_потерянный
- объем_деньги
- volume_money_per_pick
- создано в
- updated_at
Как вы понимаете, это полиморфная модель. В таблице собраны статистические данные о пикировках за все время.
Итак, теперь вот задача:
Учитывая существующий дизайн, что мне нужно сделать, чтобы я мог фиксировать записи о выборах пользователей за следующие периоды времени: 5 дней, 15 дней, 30 дней, 90 дней, 180 дней, 1 год, за все время? Он должен быть простым, эффективным и быстрым!
В настоящее время я использую Rails 2.3.11 в базе данных MySQL.