Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];

Вниз

Периодические события. Структура хранения.   Найти похожие ветки 

 
без ника   (2006-09-11 14:40) [0]

Необходимо хранить периодичски повторяющиеся события, вида: каждый день, каждый N день, каждый N-й день месяцы, каждую сб и вс.

Вопрос вот в чем - каково оптимальное решение? На мой взгляд
2 варианта :

1- хранить только описание этих событий.

2- хранить описание (п1) + сразу формировать даты срабатывания события.

Вариант 1. Мало информации для хранения событие ~ 1 запись, но очень проблематично получать даты наступления события в SQL.

Вариант 2. Придется всегда вводить дату до которой событие актуально, много данных на 1 событие (каждый день - уже 365 записей). Зато очень просто использовать в SQL.

Может какие еще варианты есть?


 
Sergey13 ©   (2006-09-11 14:45) [1]

> [0] без ника   (11.09.06 14:40)

Что-то туманно очень.
Хранить старое без разницы как, лишь было поле даты/времени. Вопрос, когда делать новую запись?


 
без ника   (2006-09-11 14:55) [2]

Ну для 1-го варианта : Таблица Events примерно

EventID       -  ID события
FromDate     - Дата начала события    
Mode          -  Режим события.  допустим Mode = 0 - каждый день. Mode = 1 - каждый P1 день месяца, Mode = 2 - каждый год. и т.д. ..
P1
...
...
PN

Т.е. каждое событие характеризует только одна запись.

Второй вариант. Добавить в Events поле ToDate - дата завершения события. И еще 1 таблицу EventsDate:

EventID ID       события
EventDate       дата


 
atruhin ©   (2006-09-11 15:03) [3]

Например так:
первая таблица - Events - описание события.
вторая таблича eventstime
- event_ref - сыылка на событие
- event_time - время возникновения
- event_date - дата возникновения, если null то событие периодическое
- event_week - день недели в который возникает событие
- event_month - день месяца в который возникает событие (по моему это лишнее можно через день недели настроить периодичность)

А далее в программе находиш не пустое поле.


 
без ника   (2006-09-11 15:03) [4]

пример данных для 1-го варианта:


EventID  | FromDate | Mode
----------------------------
1           | 11.10.06  | 0
----------------------------


Пример для 2-го случая:


EventID  | FromDate | ToDate   | Мode
----------------------------------------
1           | 11.10.06  | 13.10.06 |  0
----------------------------------------

и появляется 2-я таблица

EventID | EventDate  
----------------------
1         | 11.10.06
1         | 12.10.06
1         | 13.10.06


 
без ника   (2006-09-11 15:06) [5]

2 atruhin ©

Вот при такой структуре сложновато написать запрос

например показать даты всех переодических событий за 1 год.


 
Shaman_ ©   (2006-09-11 15:07) [6]

у меня реализован механизм как в [2], с запросами пришлось помудрить, зато все логично правильно.
А вот такой вариант - "хранить описание (п1) + сразу формировать даты срабатывания события." я бы не использовал. Даты срабатывания на какой срок формировать будешь и с какой периодичностью? :)
Лучше делай по нормальному, как [2]


 
без ника   (2006-09-11 15:11) [7]

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


 
Shaman_ ©   (2006-09-11 15:22) [8]

Как [2] - Наверно правильней сказать [2].1 :)
тоесть вариант - Начальная дата/Режим
Но думаю и так все поняли


 
Sergey13 ©   (2006-09-11 15:36) [9]

> [2] без ника   (11.09.06 14:55)

Если периодичность только тупая, т.е. через час, день, месяц, то 1 вариант предпочтительнее. Если присутствуют "каждую сб и вс", да еще с учетом праздников и т.п. второй вариант и не париться. Проще один раз расчитать и записать, чем каждый раз пересчитывать.
ИМХО.


 
без ника   (2006-09-11 15:45) [10]

периодичность как раз сложная, я просто не описывал все варианты. Там как раз учитываются дни недели, четные нечетные недели, разные месяцы и т.д. :) В общем попробую реализовать оба варианта, но склоняюсь всё же ко второму варианту. Т.к. расчет конкретных дат проще делать как раз на Delphi.


 
Sergey13 ©   (2006-09-11 15:50) [11]

> [10] без ника   (11.09.06 15:45)
> Т.к. расчет конкретных дат проще делать как раз на Delphi.

Можно попробовать и ХП прикрутить - это было бы предпочтительней. Возможно УДФ-ку придумать какую-нить в помощь.


 
Shaman_ ©   (2006-09-11 15:58) [12]

>...учитываются дни недели, четные нечетные недели, разные месяцы
Если такая структура, то действительно лучше дать пользователю интерфейс задания произвольных интервалов времени срабатывания


 
atruhin ©   (2006-09-11 16:05) [13]

Как видимо я не понятно объяснил. Я и предлагал почит вариант 2.1 только расширенный. Т.е. режим задается не в одном поле, а выбором непустого поля.
Получаем:
событие на сб, вс.
Event_time = null; event_date = null; event_week = 6;
Event_time = null; event_date = null; event_week = 7;
аналогично для дней месяца, набора дат.


 
без ника   (2006-09-11 16:16) [14]

2 atruhin ©

Я понял, все возможные комбинации разворачиваются. Но я уже говорил, что тогда вывести события за период, допустим 1 месяц - проблематично.

Т.е. входные данные у нас даты (реальные), а в таблицах хранится как написано выше только признак, допустим Пн, вт или чет нечет и т.д. Для SQL это сложная задача.


 
atruhin ©   (2006-09-11 17:47) [15]

Ну вряд ли тебе нужен список событий которые могли произойти за месяц. Обычно нужны отработанные события с результатом выполнения, а это просто заносится в лог таблицу. Т.е. гораздо легче разделить запрос на событие, и результат события, т.к. если событие усложнится то придется изменять всю логику. Например у меня в программе используется генерация событий на скидки по дням недели, по времени, складам учета, местам отпуска, а логируется отдельно в одном месте.


 
без ника   (2006-09-11 18:00) [16]

Тут ситуация как раз противоположная: задача финансового планирования, т.е. определяем условия наступления события (т.е. его периодичность), период действия и делаем прогноз  - собственно считаем примерные $ за период.


 
atruhin ©   (2006-09-11 18:34) [17]

Ну тогда возможно мой вариант не подойдет, нужно анализировать задачу.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.043 c
3-1157567051
serko
2006-09-06 22:24
2006.11.05
SQL Parse Error


15-1160453087
IMHO
2006-10-10 08:04
2006.11.05
Евро-2008: 11 октября


2-1161113639
kester
2006-10-17 23:33
2006.11.05
Аля WinHex


15-1160548053
mrcat_
2006-10-11 10:27
2006.11.05
Шахматный турнир


11-1137747496
-=Mike=-
2006-01-20 11:58
2006.11.05
Вопрос по ListView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский