![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Контроль непрерывности и непересечения интервала дат [D7, MSSQL]
девушка © (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 записей