|
|
|
Организация учета периодов аренды
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Возник вопрос, как организовать в базе данных учет периодов аренды. Примеры периодов аренды: • Через 1 (2, …) день • Каждый вторник, кроме 15 числа • По четным с 10:00 до 18:00, по нечетным с 8:00 до 13:00. • и т.д. Примеры условные, но с вариантами аренды зала для собраний по четвергам или аренды стояночного места одному арендатору в дневное время, а другому в ночное время, сталкиваться приходилось. Пока есть вариант таблицы со следующими столбцами: ПонедельникНачало, ПонедельникОкончание, ВторникНачало, ..., ВоскресеньеОкончание, значения строк -- время начала(окончания) аренды в соответствующий день недели. Такой организации учета достаточно для текущей ситуации, но для примеров выше необходимо что-то другое. Может что-то посоветуеете или все-таки не впадать в крайность и остановиться на существующем варианте. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2011, 16:29 |
|
||
|
Организация учета периодов аренды
|
|||
|---|---|---|---|
|
#18+
Если хочется вообще любые сочетания, то можно дать возможность заводить расписания с любыми правилами и исключениями, сделать свой "конструктор" для них. К правилам (и исключениям) будут относиться: будни/выходные/праздники (придётся вести календарь праздников, в нём же учитывать все переносы), чётные/нечётные дни (по числу месяца из даты), дни недели, конкретные числа месяца, сами месяцы, аренда через равные промежутки времени и т.п. И для каждого расписания свои временные рамки, например, действует с 01/03/2011 по 31/06/2011. Расписание 1: - Правило 1: каждый 3-й день, начиная с 01/01/2011, с xx:xx по yy:yy Расписание 2: - Правило 1: каждый вторник, с aa:aa по bb:bb - Исключение 1: кроме 15 числа Расписание 3: - Правило 1: по чётным, с 10:00 по 18:00 - Правило 2: по нечётным, с 8:00 по 13:00 Расписание 4 (извращенное): - Правило 1: по чётным, если день недели = вт или чт, если не праздник и не выходной, с zz:zz по vv:vv - Правило 2: по нечётным, если выходной, если вск, с mm:mm по nn:nn - Исключение 1: кроме пятницы, кроме 13 числа - Исключение 2: кроме 1 и 7 числа, кроме января - Исключение 3: кроме чётных, кроме с ff:ff по gg:gg У исключений приоритет выше, чем у правил, т.е. берем правила и вычитаем из них исключения — получаем нужные промежутки. Возможно, придётся еще что-то для ночного времени придумывать, когда дата начала != дате окончания, а может и в эту схему ляжет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2011, 17:56 |
|
||
|
Организация учета периодов аренды
|
|||
|---|---|---|---|
|
#18+
bootty, спасибо за идею. Думаю использовать вариант с 3-мя таблицами для правил: 1. Расписание (ИД, Название) 2. Правило (ИД, ВремяНачала, ВремяОкончания, Столбцы с условиями). Столбцы с условиями: ТипДня(значения "Рабочие дни", "Выходные дни"), Четность ("Да", "Нет"), ДеньНедели, Число, Периодичность и т.д. с разрешением значения Null для столбцов с условиями. 3. Период_Правило (РасписаниеИД, ПравилоИД, ДатаНачала). ДатаНачала -- дата начала действия правила. Аналогично с исключениями. Ночное время вроде укладывается в эту схему и определяется условием ВремяНачала>ВремяОкончания, при этом вместо формулы ВремяОкончания-ВремяНачала будет использоваться (ВремяОкончания+1день-ВремяНачала). Запрет на пересечение правил по принципу: любые 2 действующих правила по объекту аренды должны иметь хотя бы одно непересекающееся условие (несколько сумбурно, сорри). Была идея условия вынести в отдельные таблицы, но по-моему это будет просто усложнением схемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2011, 21:18 |
|
||
|
Организация учета периодов аренды
|
|||
|---|---|---|---|
|
#18+
WereWolf777Думаю использовать вариант с 3-мя таблицами для правил: 1. Расписание (ИД, Название) 2. Правило (ИД, ВремяНачала, ВремяОкончания, Столбцы с условиями). Столбцы с условиями: ТипДня(значения "Рабочие дни", "Выходные дни"), Четность ("Да", "Нет"), ДеньНедели, Число, Периодичность и т.д. с разрешением значения Null для столбцов с условиями. 3. Период_Правило (РасписаниеИД, ПравилоИД, ДатаНачала). ДатаНачала -- дата начала действия правила. Аналогично с исключениями.Сам бы скорее сделал 3-ю таблицу не для правил/исключений, а для самих расписаний, с какого и по какое оно действует. И все правила и исключения действуют на всём протяжении расписания. Если же расписания все уникальны и не используются повторно, то возможно таблицы 1 и 3 совместил бы. Но я не знаю вашу ситуацию, может вам надо именно так, как описали. WereWolf777Ночное время вроде укладывается в эту схему и определяется условием ВремяНачала>ВремяОкончания, при этом вместо формулы ВремяОкончания-ВремяНачала будет использоваться (ВремяОкончания+1день-ВремяНачала). Если нет ситуации, когда надо использовать формулу (ВремяОкончания + N дней – ВремяНачала), где N > 1, то может и сгодится. WereWolf777Запрет на пересечение правил по принципу: любые 2 действующих правила по объекту аренды должны иметь хотя бы одно непересекающееся условие (несколько сумбурно, сорри).Это скорее запрет на вхождение одного правила в другое целиком, но тут тоже свои заморочки. Например, так: Расписание N - Правило 1: каждый чётный будний день, с 10:00 до 14:00 - Правило 2: каждый день с 12:00 до 13:00 Целиком 2-е в 1-е не входит, но проверка не всегда будет простая. Надо смотреть, что будет проще: проверять все наложения при вводе или корректно обрабатывать такие наложения правил при вычислениях. WereWolf777Была идея условия вынести в отдельные таблицы, но по-моему это будет просто усложнением схемы.Опять же imho: я бы вынес некоторые вещи. Но для простоты можно попробовать сделать в одной. Решать вам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2011, 10:37 |
|
||
|
Организация учета периодов аренды
|
|||
|---|---|---|---|
|
#18+
WereWolf777 Может что-то посоветуеете или все-таки не впадать в крайность и остановиться на существующем варианте. Спасибо. Ответ зависит от того, что вы собираетесь с ними делать - например, рассчитывать плановую длительность ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2011, 12:11 |
|
||
|
Организация учета периодов аренды
|
|||
|---|---|---|---|
|
#18+
_модОтвет зависит от того, что вы собираетесь с ними делать - например, рассчитывать плановую длительность ? Учет периодов аренды предназначен для следующего: 1) Определение неарендованных (частично арендованных) объектов в определенные моменты времени. (Посмотреть, что еще можно отдать в аренду и на каких условиях) 2) Определение общего кол-ва дней (часов) когда объект аренды находился у определенного арендатора за определенный период времени. (Для распределения затрат между арендаторами). Возможно потом появиться еще что-нибудь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2011, 14:29 |
|
||
|
Организация учета периодов аренды
|
|||
|---|---|---|---|
|
#18+
WereWolf777Возможно потом появиться еще что-нибудь. Плюс история изменений. З.Ы. Здесь редактировать сообщения можно? Не смог найти как. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2011, 15:26 |
|
||
|
Организация учета периодов аренды
|
|||
|---|---|---|---|
|
#18+
WereWolf777Плюс история изменений.А без этого точно никак? Расписание менять будет не очень корректно, если только не выставлять для каждого правила и исключения своё время действия. Вариант: закрывать одно расписание и создавать новое, действующее с другого числа. Несколько расписаний можно привязывать к одному клиенту, договору и т.п. WereWolf777З.Ы. Здесь редактировать сообщения можно? Не смог найти как.Можно. Надо стать модератором. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2011, 15:47 |
|
||
|
Организация учета периодов аренды
|
|||
|---|---|---|---|
|
#18+
Дальнейшие размышления привели к следующей идее. Расписание -- это набор условий на конкретный период для конкретного объекта аренды. Поэтому Расписание может быть связующей таблицей. Получаются следующие таблицы: Расписание (ОбъектАрендыИД, УсловиеИД, ТипУсловия (значения "Правило"/"Исключение"), ВремяНачала, ВремяОкончания, ДатаНачалаДействияУсловия, ДатаОкончанияДействияУсловия) Условие (ИД, Столбцы с условиями). Столбцы с условиями: ТипДня(значения "Рабочие дни", "Выходные дни"), Четность ("Да", "Нет"), ДеньНедели, Число, Периодичность и т.д. с разрешением значения Null для столбцов с условиями. Для разделения условий по типу (правило или ограничение) возможны варианты. boottyСам бы скорее сделал 3-ю таблицу не для правил/исключений, а для самих расписаний, с какого и по какое оно действует. И все правила и исключения действуют на всём протяжении расписания. Если же расписания все уникальны и не используются повторно, то возможно таблицы 1 и 3 совместил бы. Наверное можно и вывести расписания отдельно, тогда получается, что при изменении/добавлении условий необходимо "закрывать" старое расписание и "открывать" новое. (так как присутствует желание хранения истории) boottyЕсли нет ситуации, когда надо использовать формулу (ВремяОкончания + N дней – ВремяНачала), где N > 1, то может и сгодится. Я думаю, что подобную ситуацию можно переформулировать таким образом (разбить на несколько условий), когда не понадобиться использовать эту формулу. boottyЭто скорее запрет на вхождение одного правила в другое целиком, но тут тоже свои заморочки. Например, так: Расписание N - Правило 1: каждый чётный будний день, с 10:00 до 14:00 - Правило 2: каждый день с 12:00 до 13:00 Целиком 2-е в 1-е не входит, но проверка не всегда будет простая. Надо смотреть, что будет проще: проверять все наложения при вводе или корректно обрабатывать такие наложения правил при вычислениях. Правило 2 не будет пропущено из-за пересечения с Правилом 1. С другой стороны возможен вариант -- использовать просто "сумму" правил, но тогда придется расчитывать итоговый период аренды для избежания двойного учета пересекающих диапазонов. Еще к тому же можно придумать ситуацию, когда потребуется использовать исключения из исключений, исключения из исключений из исключений и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2011, 15:55 |
|
||
|
Организация учета периодов аренды
|
|||
|---|---|---|---|
|
#18+
bootty, долго писал свое сообщение, поэтому не увидел твой ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2011, 16:01 |
|
||
|
Организация учета периодов аренды
|
|||
|---|---|---|---|
|
#18+
WereWolf777Дальнейшие размышления привели к следующей идее. Расписание -- это набор условий на конкретный период для конкретного объекта аренды.Т.е. чтобы получить для разных объектов одинаковые расписания (если это требуется), нужно будет заводить расписания, отличающиеся только объектами. Здась решать вам, предметная область вам должна быть знакома. WereWolf777Наверное можно и вывести расписания отдельно, тогда получается, что при изменении/добавлении условий необходимо "закрывать" старое расписание и "открывать" новое. (так как присутствует желание хранения истории)А если вы просто меняете условия, то истории по определению не остаётся. Где-то нужно еще и даты изменений хранить... Поэтому здесь проще закрытие старого и создание нового расписания, чем десятки правил с разными периодами действия в одном расписании. WereWolf777Я думаю, что подобную ситуацию можно переформулировать таким образом (разбить на несколько условий), когда не понадобиться использовать эту формулу.Можно, пожалуй. А можно добавить параметр "Кол-во дней от даты начала", и там вводить это N. WereWolf777boottyЭто скорее запрет на вхождение одного правила в другое целиком, но тут тоже свои заморочки. Например, так: Расписание N - Правило 1: каждый чётный будний день, с 10:00 до 14:00 - Правило 2: каждый день с 12:00 до 13:00 Целиком 2-е в 1-е не входит, но проверка не всегда будет простая. Надо смотреть, что будет проще: проверять все наложения при вводе или корректно обрабатывать такие наложения правил при вычислениях. Правило 2 не будет пропущено из-за пересечения с Правилом 1. С другой стороны возможен вариант -- использовать просто "сумму" правил, но тогда придется расчитывать итоговый период аренды для избежания двойного учета пересекающих диапазонов. Еще к тому же можно придумать ситуацию, когда потребуется использовать исключения из исключений, исключения из исключений из исключений и т.д.Опять же, решать вам, что удобнее: контроль пересечений правил и исключений (t1_нач > t2_кон OR t2_нач > t1_кон) или вычисление суммы. Я бы пошёл вторым путём, наверное... Мне он алгоритмически более интересен. Берем первое правило, наполняем массив отрезков занятого времени, берем второе, добавляем новые отрезки с учетом существующих и т.п... А потом вычитаем отрезки исключений. Если вдруг у вас еще есть какая-то зависимость, например, цены аренды от времени, то отрезки еще и по такому критерию раздробить можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2011, 18:13 |
|
||
|
Организация учета периодов аренды
|
|||
|---|---|---|---|
|
#18+
boottyТ.е. чтобы получить для разных объектов одинаковые расписания (если это требуется), нужно будет заводить расписания, отличающиеся только объектами. Здась решать вам, предметная область вам должна быть знакома. Да, все-таки Вы правы, расписания нужно выделять в отдельную таблицу (на данный момент всего 3 разных расписаний, в обозримом будущем возможно расширение до 5-6, а дальше будущее слабо обозримо ), только даты начала/окончания действия расписания переносить в связующую таблицу Расписание_ОбъектАренды boottyОпять же, решать вам, что удобнее: контроль пересечений правил и исключений (t1_нач > t2_кон OR t2_нач > t1_кон) или вычисление суммы. Я бы пошёл вторым путём, наверное... Мне он алгоритмически более интересен. Берем первое правило, наполняем массив отрезков занятого времени, берем второе, добавляем новые отрезки с учетом существующих и т.п... А потом вычитаем отрезки исключений. Если вдруг у вас еще есть какая-то зависимость, например, цены аренды от времени, то отрезки еще и по такому критерию раздробить можно. Чем больше думаю, тем больше тоже склоняюсь ко второму варианту (может меньше думать, а делом заняться ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2011, 21:04 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37311832&tid=1542116]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
140ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 435ms |

| 0 / 0 |
