1

Тема: Разработка структуры базы под алгоритм

Коллеги, приветствую !
Давно мучает следующий вопрос оптимального всеобъемлющего варианта структуры базы под следующую задачу.

Разрабатываю WEB органайзер для ~150 пользователей, одной из его функций будет напоминалка по расписанию. Вот в этой напоминалке и застрял с разработкой структуры базы и своими хотелками...
Хочу, много...   хочу чтобы можно было напоминать по каждому дню недели, по каждому числу месяца, в заданный день года, по каждому понедельнику (дню недели), по каждому 20-му числу каждого месяца....  вообще всяко хочу...

Но как под такую хотелку разработать структуру базы ?

Времени не хватает... :-(

2

Re: Разработка структуры базы под алгоритм

Нереальная задача, да ?

Времени не хватает... :-(

3

Re: Разработка структуры базы под алгоритм

Я вообще не очень въехал, что требуется. Что такое WEB органайзер? Кто назначает дату напоминаний? Что за база?
В общем, прошу пересказать более доступными словами.

4

Re: Разработка структуры базы под алгоритм

т.е. смысл в следующем...
каждый (из ~150 пользователей) может зайти на страничку WEB органайзера и с помощью нереального интерфейса, гибкой логики и хитрой структуры базы данных (которую я с Вашей помощью планирую придумать) смог бы себе сделать напоминалку о каком-нить событии.
Дык вот я затрудняюсь придумать такую структуру базы данных, чтобы там можно было запланировать любое напоминание...
Подразумеваю что таблицы надо иметь как минимум 2, т.к. надо учесть 2 типа заданий: 1) бесконечное 2) с заданной датой начала и заданной датой окончания

Времени не хватает... :-(

5

Re: Разработка структуры базы под алгоритм

только либо эсаш либо пакетные файлы виндуз, иного не приемлю - ибо ренегад ))

Я конечно далек от мысли... (с)

6

Re: Разработка структуры базы под алгоритм

Собственно, процедура напоминания закладывается в html-код web-страницы или в специальное приложение для напоминания, установленное на компьютере пользователя?

7 (изменено: Spy00000, 2011-08-19 20:15:59)

Re: Разработка структуры базы под алгоритм

Ну вот, как вариант:
id - номер задания. Либо уникален, либо уникальна комбинация id, user_id.
user_id - id пользователя, для которого назначено напоминание
rem_type - тип напоминания (1 - однократное, 2 - в опр. день недели, 3 - в опр. день месяца, 4 - на третий день после очередного финансового кризиса, и т.д.)
rem_num (число) - доп. параметр, зависит от rem_type, для 1 - не используется, для 2 - день недели, когда срабатывать, для 3 - день месяца и т.д.)
rem_time - время напоминания в выбранный день.
date - дата очередного срабатывания.

Дальше поля зависят от того, как должно напоминаться.
Пока предположим - как в outlook, только текст, без всяких запусков внешних программ и прочего. Тогда просто:

text - текст напоминания.

Алгоритм работы такой:
При создании задания на основе текущей даты и rem_type, rem_num, rem_time выбирается дата очередного срабатывания.
К примеру: сегодня 2011-08-19, rem_type = 2, rem_num = 6 (суббота), rem_time = 15:00, тогда очередная дата срабатывания - 2011-08-20 15:00, что и заносится в date.

После чего таблица регулярно (раз в секунду, в 5 секунд, раз в месяц) проверяется и если у какого-то задания date < текущей даты - выводится напоминание
и генерируется новая дата напоминания. Задания с rem_type == 1 просто удаляются.

Можно ввести ещё поле - активное или не активное задание, тогда задания с rem_type == 1 нужно не удалять, а делать неактивными.
Дальше - простор фантазии.

Дополнительно:
Если пользователь сам заходит на страницу, тогда проверять таблицу при входе пользователя.

Евген пишет:

Подразумеваю что таблицы надо иметь как минимум 2, т.к. надо учесть 2 типа заданий: 1) бесконечное 2) с заданной датой начала и заданной датой окончания

Если нужна дата окончания, я бы предложил держать всё в одной таблице, добавить флаг - "есть дата окончания", поле "дата окончания" и при генерации очередной даты срабатывания проверять, чтобы она не была больше "дата окончания", иначе делать задание неактивным.
А дату начала учитывать при генерации даты первого срабатывания.

8

Re: Разработка структуры базы под алгоритм

Как тогда описать задание, с помощью этой структуры, если надо напоминание каждый вторник и каждую пятницу ?
Или к одному ID задания может сделать 2 записи ? - я вот подумал...   тогда гибкости алгоритму прибавляется...   

Времени не хватает... :-(

9

Re: Разработка структуры базы под алгоритм

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

Времени не хватает... :-(

10

Re: Разработка структуры базы под алгоритм

Spy00000 пишет:

rem_type - тип напоминания (1 - однократное, 2 - в опр. день недели, 3 - в опр. день месяца, 4 - на третий день после очередного финансового кризиса, и т.д.)
rem_num (число) - доп. параметр, зависит от rem_type, для 1 - не используется, для 2 - день недели, когда срабатывать, для 3 - день месяца и т.д.)

для 1 - не используется - НЕТ !!!  Тогда для rem_type=1 в rem_num должна стоять дата !

Времени не хватает... :-(

11

Re: Разработка структуры базы под алгоритм

Ок, всем спасибо !
Думаю вопрос решён...
Кстати, довольно не сложно для реализации...

Тему прошу оставить, мало ли из башки вылетит - подгляжу...

Времени не хватает... :-(

12

Re: Разработка структуры базы под алгоритм

Евген пишет:
Spy00000 пишет:

rem_type - тип напоминания (1 - однократное, 2 - в опр. день недели, 3 - в опр. день месяца, 4 - на третий день после очередного финансового кризиса, и т.д.)
rem_num (число) - доп. параметр, зависит от rem_type, для 1 - не используется, для 2 - день недели, когда срабатывать, для 3 - день месяца и т.д.)

для 1 - не используется - НЕТ !!!  Тогда для rem_type=1 в rem_num должна стоять дата !

Дата тогда уже будет стоять в date, зачем ей ещё в rem_num?

Евген пишет:

А вычислять наверное надо не по следующей дате запуска напоминалки а на сервачке утречком запустится скриптец

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

Евген пишет:

Как тогда описать задание, с помощью этой структуры, если надо напоминание каждый вторник и каждую пятницу ?

Тут смотреть надо, какие вообще типы напоминаний будут. Если несколько дней только в "в определённый день недели" - можно в rem_num держать битовую маску дней. Иначе что-то сложнее выдумывать.

13 (изменено: Rumata, 2011-08-21 18:37:09)

Re: Разработка структуры базы под алгоритм

Это же обычный планировщик заданий. Храните в таблице отдельные части даты и сравнивайте при извлечении.


CREATE TABLE `scheduler` (
  `id` INT NOT NULL, 
  `user_id` INT NOT NULL, 
  `s_year` INT NOT NULL, 
  `s_month` INT NOT NULL, 
  `s_day` INT NOT NULL, 
  `s_wday` INT NOT NULL,
  PRIMARY KEY (`id`)
);

Установленные неотрицательные значения полей определяют периодичность выполнения задания. Например, следующим запросом можно найти все задания пользователя, которые должны быть выполнены текущим днем -- включая одноразовые (указаны год-месяц-день) и периодические (в заданный день месяца или день недели). Это примерное решение. Возможно еще требует доработки.

SELECT 
    s_year - EXTRACT(YEAR FROM NOW()) as x_year, 
    s_month - EXTRACT(MONTH FROM NOW()) as x_month, 
    s_day - EXTRACT(DAY FROM NOW()) as x_day, 
    s_wday - WEEKDAY(NOW()) - 1 as x_wday, 
    id 
FROM 
    scheduler
WHERE 
    user_id=0
HAVING 
    x_wday = 0
    OR (
        x_day = 0 OR x_month = 0 OR x_year = 0
    )

Забыл упомянуть, что сей пример написан на MySQL 4.

( 2 * b ) || ! ( 2 * b )