Привет All,данных очень много и для быстрого доступа используются четыре таблицы, в разрезе минут, дня, месяца и года.
примерно: id, date, username, countнужно создать функцию, для одновременной записи или обновления данных (тоесть function(user,count)) в 4! таблицах, но как правильно?
использовать Insert? и суммировать время от времени? это не правильно...
использовать Update? но если данных за этот день нет...наверное можно решить этот вопрос, если бы была функция IF? но в описании я её не нашел.
Подскажите плиз...
PS используется FreeBSD, Postgresql 8.1.0
>Привет All,
>
>данных очень много и для быстрого доступа используются четыре таблицы, в разрезе
>минут, дня, месяца и года.
>примерно: id, date, username, count
>
>нужно создать функцию, для одновременной записи или обновления данных (тоесть function(user,count)) в
>4! таблицах, но как правильно?Используя хранимые процедуры, или еще лучше триггеры. Заносишь в одну таблицу, а соотвествующая информацию "расползается" по остальным. /RTFM/.
>>Привет All,
>>
>Используя хранимые процедуры, или еще лучше триггеры. Заносишь в одну таблицу, а
>соотвествующая информацию "расползается" по остальным. /RTFM/.
добрый,есть 4 таблицы, они хранят трафик пользователей,
вида (id,login,t_in,t_out,t_time)
1 таблица - просто накопительные данные;
2 - в разрезе дня
3 - в разрезе месяца
4 - в разрезе годанужно, при добавлении информации в 1ую таблицу, добавлять данные и в 2,3,4
НО!
если есть данные для этого логина за этот день (для таблицы 2), месяц (для таблицы 3), год (для таблицы 4) то приплюсовать, если данных нет то вставить данные.пример таблицы 1
354712 62 2006-01-17 10:26:17.105051+03 0 0 2
354713 63 2006-01-17 10:26:19.573097+03 0 0 294
354714 63 2006-01-17 10:26:21.110374+03 0 0 3
354715 65 2006-01-17 10:26:23.236497+03 2707000 0 0пример таблицы 2
id login date tin tout time
10783652 154 2006-03-03 5279245 1161430 62218
10783653 159 2006-02-25 13506800 4559078 86981данных очень много, поэтому сделали так.
заранее спасибо.
Как вариант, для нагрузенной базы, может расссмотреть вариант запуск скрипта раз в день который все остальные таблици заполняет
>Как вариант, для нагрузенной базы, может расссмотреть вариант запуск скрипта раз в
>день который все остальные таблици заполняет
сейчас так и сделанно, и работает пол года...
только раз в час или раз в 10 минут...
но в эти минуты нагрузка 100% и ничего работать не может.мне как раз нужно по другому :(
если, можно так выразится по-человеческий.
вот пример функции на pl/pgsql, которая делает примерно то, что вы сказали
CREATE OR REPLACE FUNCTION add_traf(a_uid int4, a_t_class int4, a_bytes int8, a_ts "timestamp")
RETURNS bool AS
$BODY$DECLARE
a_uid ALIAS FOR $1;
a_t_class ALIAS FOR $2;
a_bytes ALIAS FOR $3;
s_date date;
t_date timestamp;
r_count int4;
BEGIN
-- За месяц
s_date := date_trunc('month', a_ts);
UPDATE traffic_pmonth SET bytes=bytes + a_bytes
WHERE uid = a_uid AND start_date = s_date AND t_class=a_t_class;
IF NOT FOUND THEN
INSERT INTO traffic_pmonth(uid,start_date,t_class,bytes) VALUES(a_uid,s_date,a_t_class,a_bytes);
END IF;
-- За день
s_date := a_ts;
UPDATE traffic_pday SET bytes=bytes + a_bytes
WHERE uid = a_uid AND start_date = s_date AND t_class=a_t_class;
IF NOT FOUND THEN
INSERT INTO traffic_pday(uid,start_date,t_class,bytes) VALUES(a_uid,s_date,a_t_class,a_bytes);
END IF;
-- За час
t_date = date_trunc('hour', a_ts);
UPDATE traffic_phour SET bytes=bytes + a_bytes
WHERE uid = a_uid AND start_date = t_date AND t_class=a_t_class;
IF NOT FOUND THEN
INSERT INTO traffic_phour(uid,start_date,t_class,bytes) VALUES(a_uid,t_date,a_t_class,a_bytes);
END IF;
RETURN TRUE;END;$BODY$
LANGUAGE 'plpgsql' VOLATILE;
>вот пример функции на pl/pgsql, которая делает примерно то, что вы сказали
>Привет,
СПАСИБО БОЛЬШОЕ,
помоему то, что нужно, буду пробовать.