Обновление сводной таблицы на основе триггеров и хранимых процедур - PullRequest
1 голос
/ 27 сентября 2011

У меня есть типичный сайт на основе LAMP + Zend Framework, где у меня есть базовая таблица и сводная таблица.Сводная таблица используется для отображения данных в отчетах.

Базовая таблица -

ID | Status
1 | 1
2 | 1
3 | 2
4 | 2
5 | 1
6 | 1

Сводная таблица -

Status | Count
1 | 4
2 | 2

Базовая таблица будет изменяться (вставлять, обновлять, удалять) в среднем 20 раз в день.

В настоящее время я использую триггеры для вызова хранимой процедуры, которая обновит сводную таблицу на основебазовая таблица.

Это хранимая процедура.

CREATE PROCEDURE UpdateSummary()

BEGIN

UPDATE summary a

INNER JOIN

(SELECT status, count(*) c from base group by status) b

ON a.status = b.status

SET a.count = b.c;

END

И у меня есть три триггера (по одному для каждого - Вставить, Удалить и Обновить).Я показал образец вставки один ниже.Другие аналогичны этому.

CREATE TRIGGER S_T_TRIGGER_I

AFTER INSERT ON base

FOR EACH ROW

CALL UpdateSummary();

Я хочу, чтобы сводная таблица обновлялась до последних значений всегда .Использование триггеров и хранимых процедур, как это является лучшим способом или есть элегантный способ сделать это?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Ну, вы снова и снова запрашиваете БД для данных, которые вы уже знаете.

Почему бы просто не обновить сводку только с изменениями.

DELIMITER $$

CREATE TRIGGER ai_base_each AFTER INSERT ON base FOR EACH ROW
BEGIN
  INSERT INTO summary (status, count) VALUES (NEW.status,1)
  ON DUPLICATE KEY UPDATE
    SET count = count + 1;
END $$

CREATE TRIGGER ad_base_each AFTER DELETE ON base FOR EACH ROW
BEGIN
  UPDATE summary s
    SET s.count = s.count - 1 
    WHERE s.status = OLD.status;
END $$


CREATE TRIGGER au_base_each AFTER UPDATE ON base FOR EACH ROW
BEGIN
  UPDATE summary s
    SET s.count = s.count - 1 
    WHERE s.status = OLD.status;

  INSERT INTO summary (status, count) VALUES (NEW.status,1)
  ON DUPLICATE KEY UPDATE
    SET count = count + 1;
END $$

DELIMITER ;

Это будет намного быстрее и, если говорить точнее, намного элегантнее.

2 голосов
/ 27 сентября 2011

Почему бы вам не использовать вид как:

 CREATE VIEW Summary AS 
      SELECT status, count(*)
      FROM Base
      GROUP BY status;

Каждый раз, когда вам нужно, просто сделайте:

SELECT * 
FROM Summary 

И вы получите свой результат в режиме реального времени (каждый вызов пересчитывается).

Представления могут использоваться так же, как таблица используется в Zend Framework. Просто вам нужно явно указать первичный ключ, как объяснено здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...