The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Функция для добавления/обновления данных"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Функция для добавления/обновления данных"  
Сообщение от linspb email(ok) on 27-Фев-06, 18:26 
Привет All,

данных очень много и для быстрого доступа используются четыре таблицы, в разрезе минут, дня, месяца и года.
примерно: id, date, username, count

нужно создать функцию, для одновременной записи или обновления данных (тоесть function(user,count)) в 4! таблицах, но как правильно?

использовать Insert? и суммировать время от времени? это не правильно...
использовать Update? но если данных за этот день нет...

наверное можно решить этот вопрос, если бы была функция IF? но в описании я её не нашел.

Подскажите плиз...

PS используется FreeBSD, Postgresql 8.1.0

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Функция для добавления/обновления данных"  
Сообщение от chip email(ok) on 28-Фев-06, 18:38 
>Привет All,
>
>данных очень много и для быстрого доступа используются четыре таблицы, в разрезе
>минут, дня, месяца и года.
>примерно: id, date, username, count
>
>нужно создать функцию, для одновременной записи или обновления данных (тоесть function(user,count)) в
>4! таблицах, но как правильно?

Используя хранимые процедуры, или еще лучше триггеры. Заносишь в одну таблицу, а соотвествующая информацию "расползается" по остальным. /RTFM/.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "Функция для добавления/обновления данных"  
Сообщение от linspb (ok) on 06-Мрт-06, 17:00 
>>Привет 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

данных очень много, поэтому сделали так.

заранее спасибо.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "Функция для добавления/обновления данных"  
Сообщение от K_Sasha on 06-Мрт-06, 18:37 
Как вариант, для нагрузенной базы, может расссмотреть вариант запуск скрипта раз в день который все остальные таблици заполняет
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

4. "Функция для добавления/обновления данных"  
Сообщение от linspb (??) on 06-Мрт-06, 19:06 
>Как вариант, для нагрузенной базы, может расссмотреть вариант запуск скрипта раз в
>день который все остальные таблици заполняет


сейчас так и сделанно, и работает пол года...
только раз в час или раз в 10 минут...
но в эти минуты нагрузка 100% и ничего работать не может.

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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

5. "Функция для добавления/обновления данных"  
Сообщение от rWizard email(??) on 07-Мрт-06, 12:31 
вот пример функции на 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;

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

6. "Функция для добавления/обновления данных"  
Сообщение от linspb (??) on 07-Мрт-06, 14:59 
>вот пример функции на pl/pgsql, которая делает примерно то, что вы сказали
>

Привет,

СПАСИБО БОЛЬШОЕ,
помоему то, что нужно, буду пробовать.


Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру