Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проверка на непересекаемость интервалов / 5 сообщений из 5, страница 1 из 1
24.10.2007, 06:04
    #34889715
postuser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на непересекаемость интервалов
Есть таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
change_tarifs
id_ch_t int
id_tarifs int
id int
date_start timestamp (дата начала действия тарифа)
date_end timestamp (дата конца действия тарифа)
Как можно сделать проверку на уровне БД на непересекаемость интервалов (date_start-date_end) для одного клиента (у одного клиента не может быть два тарифа одновременно)? Еще неплохо бы сделать проверку на то, чтоб у клиента не было периода времени без выбранного тарифа (на операторов нельзя надеяться).
Заранее спасибо за ответы.
...
Рейтинг: 0 / 0
24.10.2007, 06:46
    #34889731
Бабичев Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на непересекаемость интервалов
Нужно поменять структуру данных.
Все твои сложности - из-за неправильно выбранной модели данных.

Зачем тебе хранить дату окончания действия тарифа?
Достаточно хранить только дату начала.
И тогда вся таоя головная боль исчезнет.
Периоды действия тарифов не будут пересекаться, так как начало действия одного тарифа будет, по сути, датой окончания действия другого . Также не будет интервалов с неустановленным тарифом.

Тогда вся твоя проверка сведется к двум чек-констрейнтам: первый будет проверять уникальность сочетания полей <идентификатор клиента>/<дата начала действия тарифа> (фактически составной уникальный ключ)
Вторая будет проверять отсутствие пустых значений в поле с тарифом.
Обе проверки элементрано реализуются средствами обеспечения целостности данных на уровне СУБД.
...
Рейтинг: 0 / 0
24.10.2007, 10:22
    #34890061
Gold_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на непересекаемость интервалов
глянь здесь
мне правда не ответили на мои вопросики.. видимо не правильно задал )
рад что смог поднять свою тему ))
...
Рейтинг: 0 / 0
24.10.2007, 10:34
    #34890127
postuser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на непересекаемость интервалов
Бабичев СергейНужно поменять структуру данных.
Все твои сложности - из-за неправильно выбранной модели данных.

Зачем тебе хранить дату окончания действия тарифа?
Достаточно хранить только дату начала.
И тогда вся таоя головная боль исчезнет.
Периоды действия тарифов не будут пересекаться, так как начало действия одного тарифа будет, по сути, датой окончания действия другого . Также не будет интервалов с неустановленным тарифом.

Тогда вся твоя проверка сведется к двум чек-констрейнтам: первый будет проверять уникальность сочетания полей <идентификатор клиента>/<дата начала действия тарифа> (фактически составной уникальный ключ)
Вторая будет проверять отсутствие пустых значений в поле с тарифом.
Обе проверки элементрано реализуются средствами обеспечения целостности данных на уровне СУБД.
Спасибо за совет, структуру переделал, теперь эти проблемы решились.
Хотел бы еще поинтересоваться, как лучше делать детализацию счета (лог денежных списаний). Сейчас делается примерно так (упрощенно):
1) Определяется сумма и id клиента;
2) UPDATE аккоунт SET баланс=баланс-СУММА WHERE id клиента=ID;
3) INSERT детализация (id клиента, сумма, тип услуги (номер),дата) VALUES (ID, SUM, 1,'2007-10-10');
Или лучше сначала делать вставку в таблицу детализации, а потом по триггеру на нее (таб детализации) делать UPDATE таблицы аккаунтов?
...
Рейтинг: 0 / 0
25.10.2007, 12:28
    #34893899
Бабичев Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на непересекаемость интервалов
postuserСпасибо за совет, структуру переделал, теперь эти проблемы решились.
Хотел бы еще поинтересоваться, как лучше делать детализацию счета (лог денежных списаний). Сейчас делается примерно так (упрощенно):
1) Определяется сумма и id клиента;
2) UPDATE аккоунт SET баланс=баланс-СУММА WHERE id клиента=ID;
3) INSERT детализация (id клиента, сумма, тип услуги (номер),дата) VALUES (ID, SUM, 1,'2007-10-10');
Или лучше сначала делать вставку в таблицу детализации, а потом по триггеру на нее (таб детализации) делать UPDATE таблицы аккаунтов?IMHO, как делается - так и правильно. Ибо вначале мы изменяем основную сущность и в случае успешного её изменения делаем запись детальной информации по проведенной операции.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проверка на непересекаемость интервалов / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]