powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Шаблоны применения
7 сообщений из 57, страница 3 из 3
Шаблоны применения
    #36342060
Salimbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я выше приводил ссылку... немного тут процитирую:
lustin 1c++ power user
...значит архитектура данной быдло поделки трезвенная якобы, на самом деле с клиента через сервер приложений проходят прямые запросы к базе данных

база данных Oracle - структура настолько избыточная, что ужас

сервером приложений живет немного "допиленный" Tomcat - и нужен он только для выполнения регламентных заданий , вся бизнес логика выполняется в рамках клиента
... и т.д.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Шаблоны применения
    #37447368
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NafПредлагаю собрать шаблоны применения. Начну с

Шаблон: Периодические сведения
Позволяет хранить данные, зависимые от периода.

Структура:
Код: plaintext
1.
2.
3.
4.
UID:UID уникальный ключ 
BeginPeriod: date/datetime not null. Начало актуальности сведений.
EndPeriod: date/datetime Конец актуальности сведений.
<Измерения> Разрезы, в которых ведутся сведения
<Ресурсы> Сведения

Индекс: <Измерения>, BeginPeriod, EndPeriod
уникальный

Методы выборки:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Slice(Point:date/datetime): table(object, <Измерения>, <Ресурсы>)
//срез сведений по всем измерениям на дату/время Point
Select object, <Измерения>, <Ресурсы>
From <ПериодическиеСведения>
Where Point between BeginPeriod and EndPeriod

DimensionSlice(Point:date/datetime, dimension:<Измерения>) : object,<Ресурсы>
//срез сведений по одному набору измерений на дату/время Point
Select object,<Ресурсы>
From <ПериодическиеСведения>
Where (Point between BeginPeriod and EndPeriod) and (<Измерения>=dimension)
Триггеры:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
OnAfterInsert
//вставка нового значения
CurrentRes := DimensionSlice(new.Point, new.<Измерения>);
If CurrentRes.object is null then
	new.EndPeriod := null
else begin
	update CurrentRes.object 
	set EndPeriod := new.BeginPeriod; 	
	new.EndPeriod := CurrentRes.EndPeriod;
end;
	
OnAfterDelete
//удаление значения
CurrentRes := DimensionSlice(old.Point, old.<Измерения>); 
If not CurrentRes.object is null then
	update CurrentRes.object 
	set EndPeriod := old.EndPeriod; 


Код: plaintext
Where (Point between BeginPeriod and EndPeriod) 
- не совсем понял, если в базе EndPeriod текущий == NULL, то при операциях сравнения он не учитывается и, автоматически, если Point в текущем периоде, выборка из базы ничего не вернет.
Или я неправильно что то понял?
...
Рейтинг: 0 / 0
Шаблоны применения
    #37447415
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно для периодических сведений отсутствие даты слева/справа понимается как открытая границы. Если обе даты отсутствуют, то значение действует всегда, если нет даты слева - то до даты справа включительно и т.п. В практическом SQL вместо сравнения с датами можно ставить ISNULL(дата, <заведомо маленькая дата> | <заведомо большая дата>) чтобы значения попадали в выборку. Для понимания логики шаблона приведенного псевдо sql достаточно.
...
Рейтинг: 0 / 0
Шаблоны применения
    #37447555
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист-Любитель, спасибо за разъяснение.
Но все-таки, по-моему как-то не красиво и гораздо проще при вставке использовать именно эту самую заведомо большУю дату.
И тогда уже обойтись без совершенно ужасных WHERE предложений, типа

Код: plaintext
WHERE Point>=Sdate AND Point <= Nz(Edate,  2200 - 01 - 01 )
...
Рейтинг: 0 / 0
Шаблоны применения
    #37447939
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинПрограммист-Любитель, спасибо за разъяснение.
Но все-таки, по-моему как-то не красиво и гораздо проще при вставке использовать именно эту самую заведомо большУю дату.
И тогда уже обойтись без совершенно ужасных WHERE предложений, типа

Код: plaintext
WHERE Point>=Sdate AND Point <= Nz(Edate,  2200 - 01 - 01 )
Согласен, можно даже заранее писать туда не NULL, а заведомо невозможную дату
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Шаблоны применения
    #39173816
Sasha87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NafТриггеры:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
OnAfterInsert
//вставка нового значения
CurrentRes := DimensionSlice(new.Point, new.<Измерения>);
If CurrentRes.object is null then
	new.EndPeriod := null
else begin
	update CurrentRes.object 
	set EndPeriod := new.BeginPeriod; 	
	new.EndPeriod := CurrentRes.EndPeriod;
end;
	
OnAfterDelete
//удаление значения
CurrentRes := DimensionSlice(old.Point, old.<Измерения>); 
If not CurrentRes.object is null then
	update CurrentRes.object 
	set EndPeriod := old.EndPeriod; 



new.Point, old.Point
От куда берутся эти значения? У записи по структуре нет поля Point.
...
Рейтинг: 0 / 0
Шаблоны применения
    #39173830
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sasha87new.Point, old.Point
От куда берутся эти значения? У записи по структуре нет поля Point.

Действительно, на самом деле
Код: sql
1.
Point = BeginPeriod
...
Рейтинг: 0 / 0
7 сообщений из 57, страница 3 из 3
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Шаблоны применения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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