Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Контроль непрерывности и непересечения интервала дат [D7, MSSQL]


Страницы:   1 2

девушка ©   (2008-09-27 08:14:00) 

Добрый день!
Разрабатывается БД на MS SQL 2005.

Исходные условия такие:
Есть некий набор Клиентов и некий набор Объектов.
Клиенты могут владеть Объектами в течении некоторого времени.
В течении одного промежутка времени Объект может находится во владении только у одного Клиента!
Могут появляться новые Объект. В момент появления или владеет уже какой-нибудь Клиент.
клиенты могут "передавать" друг другу Объекты.

Также Объект может менять свое состояние в то время, когда им владеет Клиент (может быть "закрыт", "приостановлен"). В один момент времени Объект может находится только в одном состоянии.

Принцип реализации:
Таблица КЛИЕНТЫ.
Таблица ОБЪЕКТЫ.
Таблица СОСТОЯНИЯ_ОБЪЕКТОВ (на оформлении,открыт, приостановлен, на закрытии, закрыт).

Считаем, что если Объект закрыт - то Клиент им уже не владеет.

Таблица СВЯЗИ_ПО_ВЛАДЕНИЮ(ИД_Клиента, ИД_Объекта, ИД_СОСТОЯНИЯ_ОБЪЕКТА, дата_начала_связи, дата_окончания_связи).

//Пример данных:

СОСТОЯНИЕ1(Клиент1, Объект1, на_оформлении,10.02.2007, 12.01.2007);
СОСТОЯНИЕ2(Клиент1, Объект1, открыт, 13.01.2007, 01.01.3000); - просто открыт навсегда

//Объект1 передают во владение Клиента2 с 18.03.2007:
СОСТОЯНИЕ2(Клиент1, Объект1, открыт,13.02.2007, 17.03.2007);
СОСТОЯНИЕ3(Клиент1, Объект1, закрыт,18.03.2007, 01.01.3000);

СОСТОЯНИЕ4(Клиент2, Объект1, открыт,18.03.2007, 01.01.3000);

//Т.е. при выборке за 14.02.2007 мы видим что Объект1 принадлежит Клиенту1.
//при выборке за 18.03.2007 Объект1 принадлежит уже Клиенту2, но известно что раньше он был у Клиента1.

В качестве типа данных использую datetime.

Стоит ли учитывать время? Т.е. при всех операциях выставлять
дата_начала_связи на 00:01 текущий даты, а дата_окончания_связи на 59:59 текущей даты?

САМЫЙ ГЛАВНЫЙ ВОПРОС: как в такой системе лучше поддерживать непрерываность и непересекаемость временных интервалов?


Anatoly Podgoretsky   (2008-09-27 09:23:00) [21]

Соответвенно проверка на открытие у кого либо

Select Count(*) FROM Objects WHERE ObjectID=:ObjectID AND StartDate IS NULL


Anatoly Podgoretsky   (2008-09-27 09:19:00) [22]

> девушка  (27.09.2008 8:14:00)  [0]

Почему дата окончания меньше даты начала? Опечатка? - 10.02.2007, 12.01.2007
Зачем 01.01.3000, проще и удобнее NULL
По времени, только если оно нужно в расчетах, но во всяком случае не так, как ты предлагаешь, а реальное время, тем более, что это ничего не стоит, тип поля в обязательном порядке содержит время. Но если расчетов со временем нет, то оставить часть время равной 00:00:00.000, любые расчеты будут проще.
Ну а на главный вопрос ответа нет - поскольку система не может, только на запросами, проверяя допустимость. Например для проверки закрыта или нет связь, можно выполнить запрос Select Count(*) FROM Objects WHERE ObjectID=:ObjectID AND EndDate IS NULL


девушка   (2008-09-27 08:15:00) [23]

кросспост
http://sql.ru/forum/actualthread.aspx?bid=1&tid=599411&pg=-1

За год в таблице будет прибавляться примерно 50 000 записей


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо