Оптимизация Mysql, чтобы избежать избыточности, но при этом иметь быстрый доступ к вычисляемым данным - PullRequest
0 голосов
/ 15 мая 2010

Пример ради вопроса: у меня есть база данных, которая содержит пользователей, вопросы и ответы. Каждый пользователь имеет оценку, которая может быть рассчитана с использованием данных из таблиц вопросов и ответов. Поэтому, если бы у меня было поле оценки в таблице пользователей, оно было бы излишним. Однако, если я не использую поле оценки, то каждый раз вычисление оценки будет значительно замедлять работу сайта.

Мое текущее решение состоит в том, чтобы поместить его в поле для оценки, а затем каждые несколько часов запускать cron, который пересчитывает оценку каждого и обновляет поле.

Есть ли лучший способ справиться с этим?

1 Ответ

1 голос
/ 15 мая 2010

По моему мнению, устранение избыточности является вторичным по отношению к созданию эффективного (и разборчивого!) Кода.

Вместо использования cron для обновления счета, почему бы не создать триггер для обновления счета пользователя, когда запись вставлена ​​в соответствующее место?

Если при обновлении таблицы answers речь идет об обновлении результатов, вы должны сделать что-то вроде этого:

create trigger 'scores_increment'
    after insert on 'answers'
    for each row begin
        update 'users' set user_score = user_score + 1 where user_id = NEW.user_id;
    end;

create trigger 'scores_decrement'
    after delete on 'answers'
    for each row begin
        update 'users' set user_score = user_score - 1 where user_id = NEW.user_id;
    end;

Хотя, иногда, СУБД "икают" и забывают запустить триггер или что-то в этом роде. Я бы посоветовал ставить ваш оригинальный скрипт cron, который запускает счет раз в неделю.

...