Хранение формул (расчетов) исторически
У меня есть приложение, которое оценивает пользовательские представления и назначает значение балла для каждого представления на основе различных формул (фиксированная ставка для всех, фиксированная ставка для первых "х" записей, понижающее значение для первых "х" записей). Формулы основаны на типе представления (категория представления - это то, что определяет балльные значения и формулу, используемую при расчете указанных значений).
Проблема заключается в том, что клиент хотел бы хранить эти формулы исторически, чтобы для любой данной записи он мог просматривать формулу, которая использовалась для вычисления значения балла.
У меня есть несколько идей относительно того, как этого добиться, но ни одна из них не выглядит хорошим вариантом:
1) Сохраните формулы в коде PHP и закомментируйте прошедшие формулы, обязательно отметив эффективный диапазон дат.
2) Создайте представление при каждом изменении формулы и обновите код, чтобы использовать новое представление. Отметьте даты вступления в силу в имени представления или в коде.
3) Сохраните формулы в таблице формул, указав для каждого уникальный идентификатор, а также даты вступления в силу / выбытия.
Есть ли другой или лучший способ добиться этого? Первые два потребовали бы написания / изменения большого количества кода в случае обновления формулы, а третий требует синтаксического анализа и сохранения формул в БД (чего я пытался избежать).
Мысли?
2 ответа
Предполагая, что вы имеете в виду сохранение фактического кода, правильное место для этого находится в менеджере исходного кода, таком как Git или Subversion (SVN). Вы можете пометить релиз с определенной формулой. Таким образом, всякий раз, когда вы выпускаете новую формулу, она помечается. Вы также можете отслеживать любые незначительные изменения. Это означает, что в любой момент вы можете получить старую формулу для проверки.
Я бы, конечно, сохранил результаты формул в таблице истории как минимум. Нужно ли хранить сами формулы или нет, зависит от того, сколько формул у вас есть и как они меняются. Ваша основная таблица может выглядеть примерно так
calculation_id
record_id
points
formula_ref
Если у вас есть, скажем, 6 фиксированных формул, из которых активные формулы представляют собой некоторую их комбинацию, то ваш "Formula_ref" может быть уникальной строкой для каждой формулы (то есть "first10"). Если ваши формулы отличаются более чем от этого, или значения меняются (то есть "первый x" может измениться с "первых 5" на "первые 10" и т. Д.), То вам может понадобиться отдельная таблица для комбинаций формул и ссылки на них из истории таблица с использованием внешнего ключа. То же самое происходит, если вам нужно разрешить динамическое добавление / редактирование формул из приложения (через графический интерфейс администратора или подобное) в отличие от ручных изменений в коде.
Ваша схема также будет зависеть от того, как вы собираетесь использовать данные. Если вас интересует только история каждой записи, вероятно, будет достаточно базовой схемы, как указано выше, с текстовым полем Formula_ref (с индексом для record_id).
Не стесняйтесь опубликовать свой конкретный план схемы для получения дополнительных комментариев...