1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Структура базы данных

Тема в разделе "Программирование", создана пользователем UranUs, 23.11.09.

  1. UranUs

    UranUs Активный участник

    2.823
    1
    Может быть коряво, но тем не менее.

    Суть в следующем: Существует таблица БД(MySQL).Условно назовем ее OLD
    одно из полей - какое-то событие (показ фильма, отправление автобуса... не важно). Событие может быть периодическим, может ежедневным, может происходить только по вторникам и пятницам, а может в любые произвольные даты (не обязательно только в одну)

    Цель всего этого: Вывод чего - то типа расписания. то есть при выборе даты смотреть, какие из событий попадают на эту дату.

    Внимание, вопрос! Как ? Как это сделать с наименьшими затратами.

    Что приходит в голову: Ну заведу я еще одно поле в таблице OLD типа enum, ну пропишу туда буковки регулярности. Типа A - ежедневное, B - по конкретным дням недели, С - по конкретным датам.
    как мне еще в одной таблице NEW хранить эти даты? Ну привяжу я id записи OLD в качестве поля второй таблицы(NEW).

    но как мне сделать хранение в NEW этих дат?
    Видимые минусы - Для ежедневных событий придется делать массу записей (типа на каждый день). Для событий периодичностью 1-2-3 раза в неделю записей, естественно будет поменьше, но все равно, коробит меня от этого(.

    Может кто подскажет, в каком направлении копать?
    ЗЫ. Копал и до обеда и после ((((
     
  2. Йожкин_Кот

    Йожкин_Кот Участник

    191
    0
    А зачем для периодических событий записи в таблицу NEW добавлять? Даты в таблицу NEW добавляй только для событий, которые будут запланированы на конкретную дату. Для периодических событий придется сделай запросу по таблице OLD, для непериодических по левому соединению OLD с NEW.
     
  3. bivshii

    bivshii Активный участник

    753
    3
    Напиши функцию от даты, возвращающую либо истину либо ложь
    для каждого из периодических событий на каждую дату
    Select OLD.[Периодическое событие]
    WHERE Функция(OLD.[Периодическое событие],[ДАТА]) = 1
    UNION ALL
    Select OLD.[Непериодическое событие]
    FROM OLD join NEW on OLD.[Непериодическое событие] = NEW.[Непериодическое событие]
    WHERE DATA = ДАТА

    И никаких левых соединений
     
  4. UranUs

    UranUs Активный участник

    2.823
    1
    Йожкин_Кот,
    Примерно так и думал). НО, некошерно, как-то, получится, ежели в OLD будет событие, происходящее шесть раз в неделю(((
    Собственно, ищу более экономный алгоритм)
     
  5. bivshii

    bivshii Активный участник

    753
    3
    UranUs, в чем алгоритм неэкономный?
     
  6. UranUs

    UranUs Активный участник

    2.823
    1
    bivshii,
    пойду RTFM )). Но в общем, направление поиска понятно. сенкс

    добавлено через 1 минуту
    bivshii,
    трудно объяснить. душой чувствую, что литр, а словами пока затрудняюсь)
     
  7. eXcTa3u

    eXcTa3u Участник

    363
    0
    по структуре я бы сделал так:
    добавил таблицу Shedule, в которой такие поля:
    NEW_id (идентификатор записи в NEW)
    EventType (1 - периодически, 2 - по дням, 3 - в опред. дату)
    day1 (время запуска задания в понедельник)
    day2 (...)
    day3
    day4
    day5
    day6
    day7
    datetimerun (однократный запуск)
    interval (интервал для периодического расписания, например через каждые 48 часов или 15 минут)
    Т.о. получается некоторая избыточность, но что гораздо важнее меньше записей в таблице. Плюс одному событию может соответсвовать несколько расписаний. Например, отправление автобуса состоится по вторникам в 14.20 и по субботам в 15.30, а также дополнительный рейс 12 декября в 13.00. Это будет две записи в таблице Shedule.
     
  8. Zuka58

    Zuka58 Активный участник

    2.299
    7
    с наименьшими затратами, думаю, это можно сделать в календаре-планировщике. в Mozilla Sunbird, вроде, всё это было.